Python で GUI アプリを作るとき、自分の場合、プロジェクトのルートにメイン・プログラム app.py などを置き、アプリの処理は、機能別に名前を付けたサブディレクトリ内の Python ファイルに用意して、メイン・プログラムからインポートして利用する、といった構成にしています。IDE はもっぱら PyCharm Community 版を使っています。
GUI のレイアウトは、その都度プログラムを起動して確認する、という効率の悪いやり方で良しとしていますが、GUI とは関係が無い関数の機能をテストする際には、Jupyter Lab で対象の関数をインポートして確認しています。
Jupyter Lab の .ipynb ファイルをメイン・プログラムと同じルートに置けば、メイン・プログラムと同じようにインポートができて都合が良いのですが、ルートに .ipynb ファイルがうじゃうじゃ増えてしまって煩わしいです。そこで、jupyter というディレクトリを作って .ipynb ファイルをまとめて置くようにしています。
そうすると、対象の関数をインポートするために一手間かける必要があります。いろいろ試して、結局、なんてことはないやりかたに落ち着きましたが、もっと良いやり方が見つかるかもしれないので備忘録にしました。
下記の OS 環境で動作確認をしています。
![]() |
Fedora Linux 41 Workstation | x86_64 |
Python | 3.13.2 | |
PyCharm Community Edition | 2024.3.4 | |
jupyterlab | 4.3.5 |
説明用に下記のプロジェクトを使います。
メイン・プログラムが app.py、テストする関数が funcs/myfunc.py 内に記載されている myfunc01、この関数を Jupyter Lab を起動して jupyter/myfunc.py でテストするというケースです。以下は、例示用に用意した PyCharm のプロジェクトです。
funcs/myfunc.py 内に記載されている myfunc01 は True を返すだけの関数です。
def myfunc01() -> bool: return True
Jupyter Lab 上でのテスト
Jupyter Lab を起動してテスト用に使う jupyter/myfunc01_test.ipynb は、テスト対象の関数 myfunc01 をインポートする前に、以下のように一つ上のパスをシステムパスに追加します。
import sys path_up = '..' if not path_up in sys.path: sys.path.append(path_up)
myfunc01 を実行すると確かに True が返ってきます。
from funcs.myfunc import myfunc01 myfunc01()
True
念のため、システムのパスを確認しました。
sys.path
['/usr/lib64/python313.zip',
'/usr/lib64/python3.13',
'/usr/lib64/python3.13/lib-dynload',
'',
'/home/bitwalk/PycharmProjects/PythonProject/.venv/lib64/python3.13/site-packages',
'/home/bitwalk/PycharmProjects/PythonProject/.venv/lib/python3.13/site-packages',
'..']
結局 .. をシステムパスに追加するだけで用が足りてしまいました。Jupyter Lab 上で何回も実行してしまう可能性がありますので、一応、システムパスに .. が含まれているか確認してはいますが、なんだこれだけか…記事にするほどの内容でなかったかもしれません。
もともと Jupyter Lab では __file__ が定義されていない、ということから始まった調査だったのですが、記事公開直前に迷走してあれこれ調べ直している中で、参考サイト [3] で、__file__ と '__file__'、"__file__" の違いを知りました。結局どれも使わなかったのですが…。
Python について、ちょっとしたことでも知らないことがまだまだありそうです。😅
もっと良さげな方法が見つかれば、その都度、備忘録にします。
参考サイト
- Jupyter NoteBookとPythonで上位階層のimportをする方法 - nyatla@hatena blog [2019-04-25]
- Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定 | note.nkmk.me
- 絶対パスの取得(まとめなおし) #Python - Qiita [2018-09-08]

にほんブログ村
#オープンソース

