環境に関する備忘録

# **環境の構造**
環境構造のイメージをわきやすくするためのメモ
使用PC: Mac 

condaドキュメント
https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html

# パッケージ管理システムとは  
ライブラリなどを一つのファイルとしてまとめているものをパッケージと呼び、
**パッケージ管理システム**とはこのパッケージのインストール（アンインストール）作業を一元的管理するもので、パッケージやライブラリの依存関係などが管理できる。
例)
* Homebrew(git, tree, pyenvなど)
    *  Homebrewはシステム全体のツールやアプリケーション管理に適している。
* Conda(機械学習ライブラリなど)
    *  CondaはPythonやRの仮想環境とライブラリ管理に適している。

そのため同じパッケージ管理システムだけど対象としているレイヤが違うというイメージ。

### 各パッケージ管理システムを用いた際のディレクトリ構造（概念図）
```
[OS]
 ├─[Homebrew]  ← HomebrewはOS全体で利用可能なパッケージ管理ツール
 │     ├─ システムパッケージ（例: Python, Git, Node.js）
 │     ├─ その他の開発ツール（例: curl, wget）
 ├─[Anaconda, Pythonインタプリタ（グローバル環境: base環境）]
 │     ├─ Python本体
 │     ├─ 標準ライブラリ
 │     └─ [Condaコマンド]
 │           ├─ 仮想環境の作成・管理
 │           └─ パッケージのインストール・管理
 └─[仮想環境（プロジェクトA用）]
 │     ├─ Python本体（仮想環境用）
 │     ├─ 標準ライブラリ（仮想環境用）
 │     └─ プロジェクト専用パッケージ
 └─[プロジェクトA]
       ├─ 仮想環境設定ファイル（requirements.txtやPipfile）
       ├─ main.py（コード）
       └─ データファイルや設定ファイル

```
### 仮想環境で作業をする時の概念フロー
`Anacondaのbase環境`にある`conda`コマンドを使って、envsディレクトリ(上図の`[仮想環境]`)に仮想環境を作成・管理可能。
実際のプロジェクト作業`[プロジェクトA]`では、該当の仮想環境をアクティベートし、そこで使用したいPythonやパッケージを利用する。


# Anaconda環境でpipを使う場合 

引用：https://www.python.jp/install/anaconda/pip_and_conda.html 

> Anacondaの実行環境でも、 pip でPyPIのパッケージをインストールすることはできます。しかし、pip と conda の違いのために、依存関係の管理に不具合が発生してしまう場合があります。特に、Anaconda cloudとPyPIの両方で公開されているパッケージを pip を使ってインストールした場合などに、問題になるケースがあります。
>
>conda と pip はそれぞれ独立してパッケージのインストール環境を管理しています。conda がインストールしたパッケージは pip では把握していませんし、 conda でインストールしたパッケージの情報は pip では把握していません。このため、Anaconda環境で pip を使ってパッケージをインストールすると、パッケージの依存関係の管理に不具合が発生してしまう場合があります。

>### pipを使う場合
>Anaconda cloudで公開されているパッケージは、PyPIにあるパッケージのごく一部です。必要なパッケージがAnacond cloudになければ、pipを使ってPyPIからインストールしなければなりません。しかし、pip でインストールする前に、かならず conda search コマンドなどを使って、Anaconda で公開されていないか確認してから、PyPI版を使うようにしましょう。  
>
>pip の利用で問題が発生する場合、科学技術計算以外の用途で利用しているのであれば、そのときだけAnancondaではなく、通常のPythonに切り替えてPyPIを併用するのも一案です。


# 実際に自分の環境を眺める
* Anacondaの場所
```
Macではデフォルトでここにある。(隠しファイルになってる）
/Users/username/anaconda3

さっきの図で言うと
[OS]
 │    
 ├─[Anaconda, Pythonインタプリタ（グローバル環境: base環境）]  ←ここにあたる
 │     ├─ Python本体
 │     ├─ 標準ライブラリ
 │     └─ [Condaコマンド]
 │           ├─ 仮想環境の作成・管理
 │           └─ パッケージのインストール・管理
 └─[仮想環境（プロジェクトA用）]
 │     ├─ Python本体（仮想環境用）
 │     ├─ 標準ライブラリ（仮想環境用）
 │     └─ プロジェクト専用パッケージ
 └─[プロジェクトA]
       ├─ 仮想環境設定ファイル（requirements.txtやPipfile）
       ├─ main.py（コード）
       └─ データファイルや設定ファイル
```
これがグローバル環境(base)であり、
(base)上でconda install, pip installしたものは
```
/Users/username/anaconda3/lib/pythonX.X/site-packages/
に格納される。

[OS]
 │    
 ├─[Anaconda, Pythonインタプリタ（グローバル環境: base環境）]  
 │     ├─ Python本体
 │     ├─ 標準ライブラリ    ←ここにあたる
 │     └─ [Condaコマンド] 
 │           ├─ 仮想環境の作成・管理
 │           └─ パッケージのインストール・管理
 └─[仮想環境（プロジェクトA用）]
 │     ├─ Python本体（仮想環境用）
 │     ├─ 標準ライブラリ（仮想環境用）
 │     └─ プロジェクト専用パッケージ
 └─[プロジェクトA]
       ├─ 仮想環境設定ファイル（requirements.txtやPipfile）
       ├─ main.py（コード）
       └─ データファイルや設定ファイル

```
に格納される。


`[仮想環境(プロジェクトA用)]`を詳しくみると、下記の構造になっている。

```
[仮想環境(プロジェクトA用)]　venv/ 
│
├── bin/
│   ├── Activate.ps1
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── pip
│   ├── pip3
│   ├── pip3.12
│   ├── python
│   ├── python3
│   └── python3.12
│
├── include/
│
├── lib/
│   │
│   └── python3.12/
│       │
│       └── site-packages/
│           │
│           ├── pip/
│           │
│           └── pip-24.2.dist-info/
│
└── pyvenv.cfg
```
>引用: https://realpython.com/python-virtual-environments-a-primer/#what-is-a-python-virtual-environment

仮想環境のディレクトリには、
* Pythonと`pip`の実行ファイル（`bin/`）
* C拡張用のヘッダーファイル用フォルダ（`include/`）
* 外部パッケージをインストールするディレクトリ（`lib/`）
* ファイルには環境設定が保存されているファイル (`pyvenv.cfg`)
    * このファイルにより、その仮想環境で使用するPythonインタプリタの場所などが指定される。

この仮想環境で作業する時は`bin/`内のPythonインタプリタを使用し、インストールした外部パッケージは`lib/pythonX.X/site-packages/`に格納され、使用される。というイメージ