2025-03-13

【備忘録】Jupyter Lab で上位階層のライブラリをインポート

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 内に記載されている myfunc01True を返すだけの関数です。

funcs/myfunc.py
def myfunc01() -> bool:
    return True

Jupyter Lab 上でのテスト

Jupyter Lab を起動してテスト用に使う jupyter/myfunc01_test.ipynb は、テスト対象の関数 myfunc01 をインポートする前に、以下のように一つ上のパスをシステムパスに追加します。

jupyter/myfunc01_test.ipynb
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 について、ちょっとしたことでも知らないことがまだまだありそうです。😅

もっと良さげな方法が見つかれば、その都度、備忘録にします。

参考サイト

  1. Jupyter NoteBookとPythonで上位階層のimportをする方法 - nyatla@hatena blog [2019-04-25]
  2. Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定 | note.nkmk.me
  3. 絶対パスの取得(まとめなおし) #Python - Qiita [2018-09-08]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加