はじめに
Windows10のAnacondaで仮想環境を作成し、仮想環境にパッケージをインストールしたがimportできなかった。私の場合は環境変数の設定に問題がありました。
事象再現手順
仮想環境作成からパッケージのインストール、importの確認までの流れ。
> conda create -n py37 python==3.7
> activate py37
(py37) > conda install xxxx
> python
Python 3.7.7 (default, Apr 15 2020, 05:09:04) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import xxxx
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'xxxx'
原因
環境変数に下記の変数が設定されていた。昔の環境構築の際に設定してたみたいです。
PYTHONHOME=C:\Users\【ユーザー名】\Anaconda3
PYTHONPATH=C:\Users\【ユーザー名】\Anaconda3\Library\bin
これらが設定されている状態で環境を確認してみます。
これらの環境変数の本来の使い方ですが、PYTHONPATH
は自作のライブラリを格納したパスを指定します。パッケージ読み込み対象ディレクトリをsys.path
で出力すると、PYTHONPATH
に追加したパスが追加されていることがわかります。
(py37) > python
Python 3.7.7 (default, Apr 15 2020, 05:09:04) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
# 出力======================================================
# C:\Users\【ユーザー名】\Documents
# C:\Users\【ユーザー名】\Anaconda3\Library\bin <-- 追加されている
# C:\Users\【ユーザー名】\Anaconda3\envs\py37\python37.zip
# C:\Users\【ユーザー名】\Anaconda3\DLLs
# C:\Users\【ユーザー名】\Anaconda3\lib
# C:\Users\【ユーザー名】\Anaconda3\envs\py37
# C:\Users\【ユーザー名】\AppData\Roaming\Python\Python37\site-packages
# C:\Users\【ユーザー名】\Anaconda3
# C:\Users\【ユーザー名】\Anaconda3\lib\site-packages
# C:\Users\【ユーザー名】\Anaconda3\lib\site-packages\win32
# C:\Users\【ユーザー名】\Anaconda3\lib\site-packages\win32\lib
# C:\Users\【ユーザー名】\Anaconda3\lib\site-packages\Pythonwin
PYTHONHOME
は標準の Python libraries のパスを指定します。このPYTHONHOME
を削除してみると、パスが仮想環境に切り替わることがわかります。どうもPYTHONHOME
が設定されていると、仮想環境のactivate時にパッケージの読み込み先が正常に切り替わらないようです。
(py37) > python
Python 3.7.7 (default, Apr 15 2020, 05:09:04) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
# 出力======================================================
# C:\Users\【ユーザー名】\Documents
# C:\Users\【ユーザー名】\Anaconda3\Library\bin
# C:\Users\【ユーザー名】\anaconda3\envs\py37\python37.zip <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37\DLLs <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37\lib <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37 <- 仮想環境になってる
# C:\Users\【ユーザー名】\AppData\Roaming\Python\Python37\site-packages
# C:\Users\【ユーザー名】\anaconda3\envs\py37\lib\site-packages <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37\lib\site-packages\win32 <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37\lib\site-packages\win32\lib <- 仮想環境になってる
# C:\Users\【ユーザー名】\anaconda3\envs\py37\lib\site-packages\Pythonwin <- 仮想環境になってる
解決法
PYTHONHOME
を削除する。
PYTHONPATH
はあっても大丈夫ですが、私は不要だったので削除しました。
おまけ 他の環境変数
コマンドプロンプトでconda
を使えるようにするにはPath
に下記のパスを追加します。
C:\Users\【ユーザー名】\Anaconda3\Scripts
コマンドプロンプトで、activateせずにpython
コマンドを使えるようにするにはPath
に下記のパスを追加します。しかし、仮想環境をactivateすればpython
コマンドを使えますし、使用している仮想環境も明白なので、このパスの追加は不要だと思います。
なお、Windows10で追加する場合は、python
コマンドでwindows storeが立ち上がってしまうので、優先順位を上に設定する必要があります。
C:\Users\【ユーザー名】\Anaconda3
C:\Users\【ユーザー名】\AppData\Local\Microsoft\WindowsApps
%USERPROFILE%\AppData\Local\Microsoft\WindowsApps
上のやり方で、コマンドプロンプトでactivateせずにpython
コマンドを実行した際、DLLのパスが認識されないようで、下記のパスをPath
に追加する必要があります。
C:\Users\【ユーザー名】\Anaconda3\Library\bin
おわりに
結局、特別な開発をしない限り、PythonをAnacondaで利用する場合はC:\Users\【ユーザー名】\Anaconda3\Scripts
だけPath
に追加すれば良いと思います。