はじめに
自作ライブラリをimportする方法として,以下の方法はよく知られています.
lib_path = os.path.join(os.path.dirname(__file__), '..', 'hoge')
sys.path.append(lib_path)
しかし,この方法ではすべてのスクリプトファイルに上記のプログラムを記述する必要があり,美しくありません.
本記事では別の方法として環境変数にライブラリのパスを保存させておくことで,上記のプログラムを二度と書かなくて済むことを目指します.
環境
- Visual Studio Code
- Python 3.12 (Anaconda ではない生Python)
- Windows 11
初期状態の挙動の確認
ディレクトリ構造
現在のディレクトリ構造を以下のものとします.
myproject
├───lib
│ lib1.py
│
├───notebook
│ ├───experiment1
│ notebook1.ipynb
│
└───src
src1.py
各フォルダは以下の役割があります.
-
lib
: 自作ライブラリ -
notebook
: jupyter notebookを置く -
experiment1
: jupyter notebook で用いる分析,対象等ごとの区切り -
src
: jupyter notebook から py ファイルに清書したものを置く
本記事の目標は環境変数を用いることで src1.py
や notebook1.ipynb
から lib1.py
を呼び出せるようにすることです.
各ファイルの中身
lib1.py
ではプロット用の関数を定義しています.
import numpy as np
import matplotlib.pyplot as plt
def plot_amp_and_ph(z):
r = np.abs(z)
theta = np.angle(z)
fig, ax = plt.subplots(2,1)
ax[0].plot(r)
ax[1].plot(theta)
notebook1.ipynb
では lib1
をライブラリとして呼び出し, plot_amp_and_ph
関数を呼び出します.
import numpy as np
import matplotlib.pyplot as plt
import lib1
theta = np.linspace(0, 6*np.pi)
z = np.exp(1j*theta)
lib1.plot_amp_and_ph(z)
plt.show()
src1.py
は notebook1.ipynb
全く同じコードです.しかし,ディレクトリ構造における位置が全く異なります.本記事で扱う方法では,ライブラリとの相対的な位置関係が異なっていても使用することができます.
import numpy as np
import matplotlib.pyplot as plt
import lib1
theta = np.linspace(0, 6*np.pi)
z = np.exp(1j*theta)
lib1.plot_amp_and_ph(z)
plt.show()
プログラムの実行
現在の状態でプログラムを実行してみます.
>python src/src1.py
# Traceback (most recent call last):
# File "path-to-myproject\src\src1.py", line 3, in <module>
# import lib1
#ModuleNotFoundError: No module named 'lib1'
当然ながら,パスが通っていないので実行できません.
解決方法
環境変数の保存
パスを通すために,本記事の主題である環境変数に lib
フォルダへのパスを保存します.
PYTHONPATH
という環境変数に保存するのですが,まずはその中身を確認します.
>echo %PYTHONPATH%
# %PYTHONPATH%
環境変数 PYTHONPATH
は使われていないようです.
Anaconda を使っている人はsite-pachages
へのパスが定義されているかもしれません.
環境変数を定義するために, .env
ファイルを作成して myproject
直下に保存します.
PYTHONPATH=path-to-myproject\lib
これを保存することで jupyter notebook へのパスだけは通るようになります.実行時にライブラリが読み込まれるだけではなく,VSCode側も認識しているので,コード補完などが効くようになります.
しかし,py
ファイルを実行するときには変わらずエラーしてしまいます.
これは,使用しているターミナルが作成した環境変数を認識していないためです.
echo %PYTHONPATH%
を実行することで,環境変数が認識されていないことを確認できます.
インタプリターに環境変数を認識させる
上述の問題に対応するため,以下の方法を用いることで,環境変数を Python インタプリターに認識させます.
- VSCode上で仮想環境を立て,必要なライブラリをインストールする
-
ctrl + shift + P
入力により,仮想環境のPythonインタプリターを選択する
以上の操作を実行すると,環境変数が認識され,src1.py
をターミナルで実行することができるようになります.
結論
-
.env
ファイルにライブラリのパスを保存 - 仮想環境を立てる
-
ctrl + shift + P
で仮想環境のPythonインタプリターを選択
おわりに
インターネット上に情報があまりなかったので,この調査で私の土日は吹っ飛びました.
が,これを見ている方々のためになれば幸いです.