私は何かをしようとしていますが、私はPythonについていくつかの問題を見逃していると思います(2.7を使用していますが、可能なら)。Pythonのモジュールの相対パス
私はパッケージやモジュールのような用語についてはわかりませんが、私にとっては以下のことはかなりシンプルなものです。
これは、ディレクトリ構造である:私はすべてこの「相対を実行したいと思います
def do_stuff():
print("This should be in stdout")
:
.
├── job
│ └── the_script.py
└── modules
├── __init__.py
└── print_module.py
the_script.py
の内容:
# this does not work
import importlib
print_module = importlib.import_module('.print_module', '..modules')
# this also does not work
from ..modules import print_module
print_module.do_stuff()
print_module
の内容パス "のようなもの:
/job$ python2 the_script.py
しかしimportlib.import_module
は、さまざまなエラーを与える:
- 私はちょうど1つの入力パラメータ
..modules.print_module
を使用する場合は、Iが得る:TypeError("relative imports require the 'package' argument")
- I(上記の例のように)2つの入力パラメータを使用する場合、その後、私が取得:
ValueError: Attempted relative import in non-package
:一方ValueError: Empty module name
は私が手from ..modules
構文を使用して。
私は__init__.py
空のファイルは "パッケージ"(またはモジュールについてはわかりませんが、用語についてはわかりません)としてそのコードを修飾するのに十分なはずだと思いますが、相対パスを管理する方法について何か不足しているようです。
私は過去の人にimport os
とimport sys
からpath
や他の機能を使用して、これをハッキングされましたが、公式ドキュメント(のpython 2.7および3 *)によると、これはもはや必要ではないことをお読みください。
私は何が間違っていますか?modules/print_module.do_stuff
の内容を「相対ディレクトリ」のスクリプトから呼び出すとどうなりますかjob/
?あなたはここで、このガイドの構造に従っている場合
なぜimportlibをここで使用しますか?なぜそれを直接インポートしないのですか? –
'__init __。py'は、それが入っているディレクトリのパッケージを作成するだけです。表示したツリーの*すべてのディレクトリに' __init __。py'を追加する必要があります。また、トップレベルのパッケージディレクトリを含むディレクトリが 'sys.path'にあることを確認する必要があります。また、ファイルの1つをスクリプトとして実行できるようにするには、問題について考える必要があります記載されている[ここ](http://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py)と[here](http: //stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time)。 – BrenBarn