1. ホーム
  2. python

[解決済み] 相対パスからモジュールをインポートする

2022-03-19 16:51:22

質問

Python モジュールの相対パスを指定してインポートするにはどうすればよいですか?

例えば dirFoo には Foo.pydirBar および dirBar には Bar.py をインポートするにはどうすればよいですか? Bar.pyFoo.py ?

ここで、視覚的に表現してみましょう。

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo を含めることを希望します。 Bar しかし、フォルダ階層を再構築するという選択肢はない。

解決方法は?

両方のディレクトリが実際のPythonパッケージであると仮定します。 __init__.py ファイルの中にある)、スクリプトの位置から相対的にモジュールをインクルードするための安全な解決策を紹介します。

これは、スクリプトに一連のモジュールを含める必要があるため、これを行いたいのだと推測します。私はいくつかの製品でこれを使用しており、別のディレクトリから呼び出されたスクリプトや、新しいインタプリタを開く代わりに python execute で実行されたスクリプトなど、多くの特殊なシナリオで機能します。

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

おまけに、この方法では、システムにインストールされているモジュールではなく、あなたのモジュールをPythonに使わせることができます。

警告! 現在のモジュールが egg ファイルを作成します。おそらくこれも失敗でしょう。