目的
Anacondaの仮想環境を立ち上げたときに自動で環境変数PYTHONPATH
を設定します。
その他の環境変数の設定も同様に可能です。
背景
以下のようなディレクトリ構成で開発を行っていました。
project/
├ modules/
│ ├ module1.py
│ └ module2.py
├ sub1/
│ ├ notebook1.ipynb
│ └ script1.py
└ sub2/
├ notebook2.ipynb
└ script2.py
project/modules/
以下には、複数のサブディレクトリで共通して使いたい自作モジュールを配置しています。
このとき、例えばproject/sub1/script1.py
からmodule1
をインポートする場合、以下のようにモジュール検索パスを追加する必要がありました。
import sys
sys.path.append("..")
from modules import module1
毎回これを書くのは面倒なので、Anacondaの仮想環境を立ち上げた際に、自動的に環境変数PYTHONPATH
を設定するようにしました。
仮想環境での環境変数の設定
Condaユーザーガイド (Saving environment variables)に詳しい説明があります。
対象の仮想環境ディレクトリにetc/conda/activate.d/
とetc/conda/deactivate.d/
という二つのディレクトリを作成します。
activate.d/
には環境起動時に実行するスクリプトを、deactivate.d/
には環境終了時に実行するスクリプトを配置します。スクリプトはこちらにあります。
#!/bin/bash
_additional_path="/path/to/your/modules"
if [ -z "$PYTHONPATH" ]; then
export PYTHONPATH="$_additional_path"
else
export OLD_PYTHONPATH="$PYTHONPATH"
if [[ ":$PYTHONPATH:" != *":$_additional_path:"* ]]; then
export PYTHONPATH="$PYTHONPATH:$_additional_path"
fi
fi
#!/bin/bash
if [ -n "$OLD_PYTHONPATH" ]; then
export PYTHONPATH="$OLD_PYTHONPATH"
unset OLD_PYTHONPATH
else
unset PYTHONPATH
fi
これらを配置した状態でconda activate env
を実行するとPYTHONPATH
が設定され、conda deactivate
を実行するとPYTHONPATH
は元に戻ります。
VSCodeのJupyter拡張機能を使う場合
ターミナルでPYTHONPATH
を設定していても、VSCodeのJupyter拡張機能を使ってノートブックを実行した場合には反映されません。これについてはGithub Issueがありました。
$PYTHONPATH in notebook is different than in terminal #9436
Issueにあるように、VSCodeのJupyter拡張機能を使う場合にはワークスペースディレクトリに.env
ファイルを配置しましょう。自動的にPYTHONPATH
が設定されます。
PYTHONPATH=/path/to/your/modules