次の構造があるとします。
app/
__init__.py
mod.py
pkg/
__init__.py
submod.py
ここで、モジュールsubmod
には への相対インポートがありますmod
。つまり:
from .. import mod
submod
スクリプトとして実行したい場合は、から次のことができることを理解していますapp/
python -m pkg.submod
しかし、システムのどこからでもsubmod.py
呼び出すことができる実行可能モジュールになりたいと思います
python /path/to/submod.py
私はPEP-366がこれを修正したと考えました。つまり、 で相対インポートを行う前に、次のボイラープレート コードを追加すると考えましたsubmod
。
if __name__ == "__main__" and __package__ is None:
__package__ = "app.pkg"
その後、通常の に戻ることができましたpython /path/to/submod.py
。ただし、それを行うと、次のようになります。
SystemError: Parent module 'app' not loaded, cannot perform relative import
なんで?
最後に、解決策の 1 つは、通常のインポートを参照して実行し、相対インポートを回避できるように操作sys.path
することであると理解しています。しかし、この質問が示すように、1 つのモジュールの変更が他のすべてのモジュールに反映されるため、これは危険です。submod
mod1
import mod1
sys.path
sys.path
次のいずれかを使用する方法はありますか:
- 通常のpython /path/to/submod.py呼び出しをサポートする相対インポート
また
- python /path/to/submod.py
sys.path
を改ざんしたりせずにモジュールを実行する機能PYTHONPATH
?