Anaconda仮想環境について

## 1. はじめに
普段、ディープラーニング関係はPyCharm上で、csvファイルのデータの集計などはJuypter Notebook上で今までほぼ不自由なく、仮想環境のことなどはあまり深く考えず使ってきたのですが、Jupyter Notebook上でもtensorflowを使ってみようと思い、色々調べたことをメモしておきます。

OSはWindowsです。
Anacondaはインストール済みという前提です。

間違いや追記したほうがいい内容があればご指摘いただければ幸いです。



## 2. Anacondaプロンプト
Anacondaをインストールすると、Anacondaプロンプトが使用できるようになります。Anaconda Navigatorというのもありますが、起動が遅いので私はあまり使っていません。なので、Anacondaプロンプトが起点になっています。

Anacondaプロンプトでできることは

* **Pythonインタプリタの起動**
* **condaコマンドの使用**
    * **Anaconda仮想環境の操作**
    * **パッケージの操作** (pipは使わないほうがいい）
* **Jupyter Notebookの起動**
* **TensorBoardの起動**

などです。

Windowsではコマンドプロンプトがありますが、AnacondaプロンプトはコマンドプロンプトにAnacondaの環境変数がセットされたものです。コマンドプロンプトで使うcdやdirはAnacondaプロンプトでも使用できます。



## 3. Anaconda仮想環境
Pythonでは仮想環境というものが使えます。Python標準の仮想環境はvenvというもののようですが、Anacondaをインストールした場合にはAnaconda仮想環境というものを使用します。

Pythonではまず仮想環境を作って、その中に必要なパッケージをインストールしていくことになります。仮想環境を使いこなすことで、プロジェクト毎に必要なパッケージを必要なバージョンのまま保っておくことができます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280874/637ee1c0-9e74-a180-2632-68486c0fcd73.png)


* Pythonインタプリタ自体も仮想環境にインストールされているパッケージの一つで、仮想環境毎に異なるバージョンのPythonを使用することもできます。
* Jupyter Notebookを使用する場合、仮想環境の下にjupyterパッケージがインストールされている必要があります。



## 4. condaコマンドによる仮想環境の操作

* **conda env list**
    * Anaconda仮想環境の一覧
    * これにより、Anaconda仮想環境の実体がどこにあるのかも表示される
    * 現在Activate中の仮想環境に*がつく
    * **conda info -e**でも同じ
* **conda activate [name]**
    * 仮想環境に入る
* **conda deactivate**
    * 仮想環境を抜ける
* **conda create -n [name] python=3.6**
    * 新しい仮想環境を作る
* **conda create -n [new name] --clone [existing name]**
    * 既存の仮想環境をコピーして新規に仮想環境を作る
* **conda remove -n [name] --all**
    * 仮想環境を削除



## 5. condaコマンドによるパッケージの操作
パッケージはよくpipでインストールしたりするようですが、Anacondaがインストールされている場合、pipは極力使わないほうがいいようです。（[ここ](http://onoz000.hatenablog.com/entry/2018/02/11/142347)を参照）

* **conda list**
    - 現在Activate中の仮想環境にインストール済みのパッケージの一覧
* **conda list -n [name]**
    * 現在Activate中ではなく、[名前]で指定した仮想環境にインストール済みのパッケージの一覧
* **conda install [name]**
    * パッケージのインストール
* **conda install [name] ==x.x.x**
    * パッケージのインストール（バージョン指定）
* **conda uninstall [name]**
    * パッケージのアンインストール
* **conda update --all**
    * 現在Activate中の仮想環境のすべてのパッケージを更新
* **conda update [name]**
    * パッケージを指定して更新



## 6. その他のcondaコマンド
* **conda --version**
    * condaコマンドのバージョンを調べる
* **conda update -n base conda**
    * condaのバージョンを更新



## 7. Jupyter Notebook
通常、Pythonでコードを描くとき、AnacondaプロンプトからPythonインタプリタを起動して作業することはあまりしないと思います。もっと使いやすいJupyter NotebookやPyCharmなどのIDEを使用すると思います。

* Jupyter NotebookはAnacondaプロンプトで```jupyter notebook```で起動し、```CTRL+C```で終了します。

![190412-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280874/ff639f4a-dc8b-d66b-a607-c5a9fd851076.png)

* Jupyter NotebookではWebアプリとしてのインターフェースの裏側でIPythonカーネルが動いており、IPythonカーネルがPythonインタプリタとJupyterインターフェースの橋渡しをしている関係になっています。
* IPythonカーネルのほかにIRubyなどが[使えるようです](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels)。
* Jupyter Notebook上では```!conda env list```というように先頭に!を付けてAnacondaプロンプト（シェル）上での操作をJupyter Notebook上でできます。
* またJupyter Notebook上で```%pwd```というように先頭に%を付けてマジックコマンドを実行できます。
* マジックコマンドはIPythonカーネルが提供する機能です。



## 8. Jupyter Notebookで仮想環境を切り替えられるようにする

Jupyter NotebookはAnacondaをインストールしたままの状態では仮想環境の切り替えができないので、これができるようにします。
大まかな手順は

1. environment_kernelsをインストール
2. jupyter configファイルを生成
3. jupyter configファイルに仮想環境を読み込む設定を追記

なお、わざわざenvironment_kernelsをインストールしなくても、シェルの機能を使って```!conda activate test_env```などとすれば仮想環境が切り替わるような気がしますが、うまくいきませんでした。

Jupyter Notebookで仮想環境を使うためには、その仮想環境にjupyterパッケージがインストールされている必要があります。



### 8.1 environment_kernelsのインストール

上に書いたように、Anacondaを使用する場合はパッケージのインストールにはpipではなくcondaコマンドを使用したほうがいいのですが、condaでenvironment_kernelsをインストールしようとすると「（Anaconda社のリポジトリに）パッケージが見つからない」というようなエラーが出ました。
仕方ないので私はpipでインストールしました。

<details><summary>サンプルコード（プロキシ通過）</summary><div>

pipでインストールするときは[プロキシ情報をいちいち記述する必要があります](http://blackwhitebear.hateblo.jp/entry/2018/01/04/201908)。
* ユーザー名：yaki
* パスワード：sobamilk
* プロキシアドレス：yaki.soba.milk.com
* プロキシポート番号：8080

```console
(base) C:\... >pip install environment_kernels --proxy=http://yaki:sobamilk@yaki.soba.milk.com:8080/
```

</div>
</details>



### 8.2 jupyter configファイルの生成

フォルダ```C:\Users\user_name\.jupyter```の下にjupyter_notebook_config.pyというファイルがなければ、Anacondaプロンプトから次の操作でデフォルトのjupyter configファイルを生成します。

```console
(base) C:\... >jupyter notebook --generate-config
```



### 8.3 jupyter configファイルに仮想環境を読み込む設定を追記

生成されたjupyter_notebook_config.pyは全行コメントアウトされています。
末尾に次の行を追加します。

```python
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.conda_env_dirs = [ 'C:/Users/user_name/AppData/Local/Continuum/anaconda3/' ]
```

* 上の行は不要というサイトがあったりしますが、私の場合は必要でした。
* 下の行の[]内はAnaconda仮想環境が集まっているフォルダを指定します。
* jupyter_notebook_config.pyファイルは.pyファイルとなっているので、ファイルパスの区切り文字が￥だとダメ。

また、このjupyter_notebook_config.pyを編集することでJupyter Notebookの作業フォルダを変更したり、その他いろいろ[カスタマイズできる](https://qiita.com/ynxx/items/602ba0d8dd546e5e1763)模様。

以上でJupyter NotebookのKernel -> Change kernelから仮想環境が選択できるようになります。

![190412-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280874/78bb8a54-9d2e-5c59-5848-367072498318.png)


## 9. PyCharm

* PyCharmではFile -> Settingsで出てくるウィンドウのProject Interpreterから作成済みのAnaconda仮想環境を指定できます。
* PyCharm上でもJupyter Notebookは使用できるようです（[ここ](https://qiita.com/pashango2/items/de342abc10722ed7a569#jupyter-notebook%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA)を参照）が、IPython NotebookサーバーのURLの指定がうまくいかないせいか、使えませんでした。時間のある時にまた試してみたいと思います。

## 10. Anaconda仮想環境をJupyterLabで使う（210702追記）

conda仮想環境をつくり、JupyterLabのカーネル切替でそれを選択する手順を追記します。

### AnacondaPromptで仮想環境を作る

test_envという名前の仮想環境を作ります。このときjupyterlabも記述しておくと後で使用するipythonやipykernelもインストールされるので便利です。

```console
conda create -n test_env python=3.8 jupyterlab     # 仮想環境を作成
conda env list                                     # 追加された仮想環境を確認できる
```

### 作った仮想環境に入り、Jupyterカーネルに追加する

```console
activate test_env
```

仮想環境をカーネルに追加するには下記の2通りがあるようですが、どちらでもいいようです。

```console
ipython kernel install --user --name=test_env --display-name=test_env
python -m ipykernel install --user test_env --display-name test_env
```

追加したカーネルは

```console
jupyter kernelspec list
```

で確認できます。このときJupyterカーネルの実体のあるフォルダが表示されますが、そのフォルダの直下にkernel.jsonというファイルがあり、このファイルの中にAnaconda仮想環境へのリンクが記入されています。[このファイルが何らかの理由で正しく作られれないとエラーを出す場合がある](http://penguinitis.g1.xrea.com/computer/programming/Python/jupyter_notebook_kernel_error.html)ようです。（私の場合は正常に作られてました）

通常は以上でJupyterLabから仮想環境を利用できるはずですが、最近、同じことをやってみても、JupyterLabで仮想環境を切り替えることはできるけど、しばらくすると勝手にNo Kernelに切り替わってしまい、コードセルの実行もできない症状に見舞われました。

### pyzmqを更新する

色々調べたところ、[仮想環境を作ったときにインストールされるpyzmqというモジュールに問題がある](https://rakuichi4817.github.io/posts/2021/0405/conda-env-jupyter-kernel/)ようです。pyzmqのバージョンが20だと上記のような症状になるようで、私の場合、conda-forgeでpyzmqをインストールすることでバージョン22が入り、正常に動作するようになりました。

```console
conda install -c conda-forge pyzmq     # pyzmqを更新する

conda list pyzmq
# Name                    Version                   Build  Channel
pyzmq                     22.0.3           py36hb0157bd_0    conda-forge
```