1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python+VScode 環境変数PYTHONPATHで自作ライブラリにパスを通したい!

Last updated at Posted at 2024-10-27

はじめに

自作ライブラリを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.pynotebook1.ipynb から lib1.py を呼び出せるようにすることです.

各ファイルの中身

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 関数を呼び出します.

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()

src1.pynotebook1.ipynb 全く同じコードです.しかし,ディレクトリ構造における位置が全く異なります.本記事で扱う方法では,ライブラリとの相対的な位置関係が異なっていても使用することができます.

src1.py
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 直下に保存します.

.env
PYTHONPATH=path-to-myproject\lib

これを保存することで jupyter notebook へのパスだけは通るようになります.実行時にライブラリが読み込まれるだけではなく,VSCode側も認識しているので,コード補完などが効くようになります.

しかし,py ファイルを実行するときには変わらずエラーしてしまいます.
これは,使用しているターミナルが作成した環境変数を認識していないためです.
echo %PYTHONPATH% を実行することで,環境変数が認識されていないことを確認できます.

インタプリターに環境変数を認識させる

上述の問題に対応するため,以下の方法を用いることで,環境変数を Python インタプリターに認識させます.

  1. VSCode上で仮想環境を立て,必要なライブラリをインストールする
  2. ctrl + shift + P 入力により,仮想環境のPythonインタプリターを選択する

image.png

以上の操作を実行すると,環境変数が認識され,src1.py をターミナルで実行することができるようになります.

結論

  1. .envファイルにライブラリのパスを保存
  2. 仮想環境を立てる
  3. ctrl + shift + P で仮想環境のPythonインタプリターを選択

おわりに

インターネット上に情報があまりなかったので,この調査で私の土日は吹っ飛びました.
が,これを見ている方々のためになれば幸いです.

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?