2

次の構造があるとします。

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 つのモジュールの変更が他のすべてのモジュールに反映されるため、これは危険です。submodmod1import mod1sys.pathsys.path

次のいずれかを使用する方法はありますか:

  • 通常のpython /path/to/submod.py呼び出しをサポートする相対インポート

また

  • python /path/to/submod.pysys.pathを改ざんしたりせずにモジュールを実行する機能PYTHONPATH

?

4

2 に答える 2