自分とこの環境下におけるPython使用ルール

完全に研究室のPython使用ルールとしてページを作成する．

# 更新履歴
2021/03/27:書き始め

# 概要
## Pythonとパッケージ
Pythonにはパッケージと呼ばれる沢山の便利ライブラリがある．これを必要に応じてインストール・使用することで色々なプログラムを簡単に作れる．とりあえず，「Python パッケージとは」とかで検索するとちゃんと説明文が出てくるので詳しくはそちらを参考のこと．

## 便利なパッケージの落とし穴？
ちょっと複雑なコードを書こうとすると，なんらかのパッケージをインストールすることになる．するとどうなるか．気軽にパッケージをインストールできる分，プログラムとパッケージの依存関係が強くなる．しかも，バージョンの依存関係も結構面倒で，最新版にしていれば大丈夫！なんてことはない．むしろ「適切なバージョンを使用しましょう(それは最新版ではありません)」となることがある．

その結果，Pythonコードを先輩・同輩からもらった時に導入パッケージの違いによって動かないことがある．例えば先輩がOpenAI gymのパッケージ`gym`をインストール・利用してコードを書いているとする．後輩がそのコードをもらった時に`gym`をインストールしていない or 大きく異なるバージョンを使用していると

<font color="red">「あれ？動かない，なんで？」</font>

となっていらん時間をくってしまう．なので使っているパッケージ含めて管理をする必要がある．うちではanacondaを使うことにするので，関連する情報を記載しておく．

## 方針
+ 必要なパッケージは<font color="red">プロジェクト・プログラムごとに導入</font>
+ 導入したパッケージを記録しておきコードと共に管理(GitLab)
+ 他の人が使用したい場合，コードと共に記録したパッケージ情報を使用

以上の実現のために，Anacondaをインストールし，その一部であるconda仮想環境を利用する．

+ <font color="red">プロジェクト・プログラムごとにconda仮想環境を作成</font>
+ 仮想環境ごとに必要パッケージを導入し，仮想環境の情報として保持，コードと共に管理
    + 仮想環境の情報は`conda env export > env.yaml`でyamlファイル(名前は自由)に保存
+ 他の人が使用したい場合，yamlファイルから仮想環境を復元し利用
    + 仮想環境の情報は`conda env create -f env.yaml`で復元

パッケージは仮想環境毎にインストールすることになるので手間がかかる一方，仮想環境間での独立性は高まる(プロジェクト・プログラムに合わせてパッケージのバージョンを自由に変えられる)．

## 具体的な流れ
1. プロジェクト・プログラムのディレクトリ用意．
1. 仮想環境用意(`conda create`)．
1. 普通にコーディング．必要に応じてパッケージをインストール(`conda install`)．
1. 仮想環境の情報をyamlファイルに保存して，git処理(`conda env export`, `git add/commit`, `git push`)．
1. 以上を繰り返し．

特にyamlファイルに保存し，git管理下に置くことが重要．忘れるべからず．

# 準備
anacondaをインストール．インストール方法は[公式のインストールページ](https://www.python.jp/install/anaconda/)にOS毎の方法があるのでそちらを参照．

# 使用方法
## 公式
公式に[Condaコマンド](https://www.python.jp/install/anaconda/conda.html)のページがあり，まとまっている．

## 設定
anacondaをインストールするとログイン時からデフォルトの仮想環境(名前:base)にいる．そもそもログイン時に仮想環境にいることが嫌ならば以下の設定でデフォルト動作を決められる．

```terminal
$ conda config --set auto_activate_base false # デフォルトオフ
$ conda config --set auto_activate_base true # デフォルトオン
```

## GUIでの操作
CUI操作が基本だけど，GUIの操作はとても楽．以下でGUIでの操作を可能とするanaconda navigationを起動．

```terminal
$ anaconda-navigation
```

## CUIでの操作の簡単な説明
仮想環境の名前を[名前]として表記．例えば`$ conda active [名前]`で具体的な仮想環境の名前をtestとする場合，`$ conda active test`となる．また，現在の仮想環境の名前は`([名前])$`のように$の前に表示される．例えば`(test)$`となる．

### Pythonのバージョン変更
例えば3.8にする場合は以下のとおり．

```terminal
$ conda install python=3.8
```

### 新しい仮想環境の作成
```terminal
$ conda create --name [名前]
```

Pythonのバージョンを指定して作成する場合は以下のとおり

```terminal
$ conda create --name [名前] python=3.8
```

### 仮想環境の起動・変更
```terminal
$ conda activate [名前]
```

### 仮想環境自体を終了
```terminal
$ conda deactivate
```

### 現在の仮想環境にパッケージをインストール・アンインストール
```terminal
$ conda install [名前]
$ conda uninstall [名前]
以下例
$ conda install tensorflow # version指定しない場合
$ conda install tensorflow=1.15 # version指定するの場合
```

ここでcondaが取り扱っていないパッケージも存在する．その場合はpipにてインストールすることになるが，condaの管轄外に置かれてとても面倒なことになる．困った場合は，誰かに相談．
一応[参考ページ](https://www.python.jp/install/anaconda/pip_and_conda.html)．

### インストール済みパッケージ確認
```terminal
$ conda list
```

### パッケージのアップグレード
```terminal
$ conda upgrade [パッケージ名]
```

### 仮想環境の情報(特にパッケージリスト)を出力
yamlファイルに出力

```terminal
$ conda env export > [exportファイル名].yaml
```

### 仮想環境の情報から仮想環境を構築(パッケージを自動的にインストール)
```terminal
$ conda env create -f [exportファイル名].yaml
```

### 仮想環境のクローン
```terminal
$ conda create -n [新環境の名前] --clone [元の環境]
```

### 仮想環境の削除
```terminal
$ conda remove -n [削除する環境の名前] --all
```



### 仮想環境の一覧
```terminal
$ conda info -e
```