私は、他のソースファイルをインポートするのと同じように、Pythonのような頭痛を引き起こすことはありません。だからここに質問があります: 私のモジュールのインポートは、コードの実行方法に依存する必要がありますか?Pythonモジュールのインポートは、コードの実行方法によって異なりますか?
私は、次のディレクトリ構造を持っている:
./__init__.py
./config.py
./kmer
./kmer/__init__.py
./kmer/__main__.py
./kmer/__pycache__
./kmer/__pycache__/__init__.cpython-36.pyc
./kmer/__pycache__/__main__.cpython-36.pyc
./kmer/__pycache__/bed.cpython-36.pyc
./kmer/__pycache__/config.cpython-36.pyc
./kmer/__pycache__/reference.cpython-36.pyc
./kmer/__pycache__/sets.cpython-36.pyc
./kmer/bed.py
./kmer/config.py
./kmer/reference.py
./kmer/sets.py
私はkmer
パッケージ内の他のモジュールからkhmer
内のモジュールをインポートしたいです。シンプル?
だから私はbed.py
のでこれを追加します。
import reference
import config
import sets
私はkmer
ディレクトリからpython bed.py
を実行すると今のものはうまく動作します。 1つのディレクトリに戻ってpython kmer/bed.py
に電話しても問題ありません。 pythonのように、指定されたファイルを基準にしてインポートされたモジュールを検索します。
kmer
ディレクトリのpython -m bed
ディレクトリを再度実行すると、正常に動作しますが、1つのディレクトリに戻ってを実行すると、モジュールエラーが発生します。ここでは、Pythonはインタプリタのカレントディレクトリ内のモジュールを探します。このディレクトリはファイルシステム上のどこにでも置くことができるので、相対的なインポートは機能しません。
これは、基本的には、コードがどのように実行されるかに依存してインポートが意味をなさないことを意味します。私はこれがどのように動作するはずであるかについての説明に感謝します。
this質問に対する回答を含めてかなり多くのリソースを見てきましたが、非常に詳細ですが(私が実際に見つけた最良の説明の1つですが)問題を解決していないし、 。
更新:この質問は、相対インポートのさまざまな側面、より正確には、コードを実行するさまざまな方法が、重複としてマークされているものよりインポートにどのように影響するかに焦点を当てていると思います。それで私は最初に他の質問を述べました。したがって、私はこれが重複しているとは思わない。
あなたの問題を解決するように見えるので、リンクされた質問があなたの問題を解決しない方法を説明する必要があります。 – user2357112
@ user2357112この質問を異なるものにするのは、以下のDavisの答えが指摘する、パッケージとスクリプトのセマンティクスの混在部分です。私はリンクされた質問から理解を得ていませんでしたし、理解は当然、主観的です。 – DarthPaghius