問題タブ [relative-import]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 外部ディレクトリからのパッケージの実行 - インポートの問題
私はパッケージを持っています:
__main__.py
ファイル__init__.py
が空です。
たとえば、指定されたパスから mypkg を実行する必要があります。
この方法で mypkg を実行すると、次のエラーが表示されます。
from mypkg import mod1
これは、変更すると解決できますfrom . import mod1
が、PEP8 は相対インポートよりも絶対インポートを推奨しています。
私が見つけた別の解決策は、追加することです:
__init__.py
ファイルする
その後、すべてがうまく機能します。
質問は次のとおりです。より良い解決策は何ですか? 相対インポートを使用するか、sys.path を操作してパッケージを適切に実行するか、この問題の別の解決策が存在する可能性がありますか?
python - ImportError ではなく、「トップレベル パッケージを超えた相対インポートの試み」が ValueError になるのはなぜですか?
最上位のパッケージを超えて相対インポートを行うと、例外が発生します — 驚くことではありません。しかし、なぜそれはであり、ValueError
ではないのImportError
ですか?
ImportError
この例外はパッケージのインポートに関連しており、通常はImportError
(またはそのサブクラス) を与えるため、私は を期待していましたModuleNotFoundError
。ここでの根拠は何ですか?
python - Python 2.7 パッケージでの複数の相対インポート
相対インポートに関するSOの質問がたくさんあることを理解しています。そこに解決策を試した範囲を記録しますが、それでも問題を解決できません。
次のディレクトリ構造があります。設計上は私のものではありませんが、必要に応じて変更するためのゲームです(フォークされたレポ)。
このレポでモデルを実行するには、使用します
python main_Exp.py input_file.csv
内部main_Exp.py
:
内部ResNet/ThreeDMM_shape.py
:
わかりました。明らかに、このハードコードされた絶対パスを変更する必要があります。これらのファイルをたまたまインストールした自分の特定のパスを使用せずに、正しい方法で実行したいと思います。
だから私は試します
(1)フォルダー__init__.py
にファイルを追加しました ( で表示) (2) ファイルをモジュールとして実行してみました:
(3)最上位フォルダー ( ) にも追加しようとしましたが、ナンセンスだと思います。(4)に追加されたパスを使用して最初のインポートが行われたことを考えると、インポートを次のように変更してみました。ResNet
(*)
python -m main_Exp input_file.csv
__init__.py
exp
kaffe
sys.path
from .tensorflow.network_shape import Network_Shape
すべての手順の後、同じエラーが発生します。
したがって、相対インポートに関するルールと、ファイルを適切に参照する方法を理解していません。これを行う方法と、そのようなインポートについて一般的に考える方法を理解するのに役立つポインターを本当に感謝します!
python - 現在のスクリプトに関連するモジュールをインポートしています(トップレベルを超えて)
a
のいくつかのバージョンを含むプロジェクトがあるmain#.py
ので、それらを というディレクトリに整理しますrun
。私は通常、 を呼び出しa
てからプロジェクトを実行します。最上位パッケージを超えたインポートが含まれるため、 in で指定する必要があります。./a
python run/main1.py
main1.py
sys.path.insert(0, "./")
main1.py
からb
インポートするプロジェクトを作成しました。から、具体的にインポートするにはどうすればよいですか?main1.py
a
b\main.py
main1.py
a/utils.py
要件:
プロジェクト
a
は私がずっと前に取り組んでいたプロジェクトなので、そのヘッダーだけに限定的な変更を加えたいと思います。今のようpython run/main1.py
に働きたい。プロジェクトを異なるコンピューター間で移動する可能性があるため、それ自体
main1.py
に対してインポートする必要がutils.py
あります。(つまり、絶対パスでインポートしない)ソリューションがスケーラブルであることを望みます。
b
のような構造の他のいくつかのプロジェクトからモジュールをインポートする必要がありますa
。システムの PATH 変数を拡張すると、問題が発生する可能性があると思います。もっときちんとした解決策はありますか?
私のプロジェクトのファイルは次のとおりです。
- a
- 走る
- main1.py
- ユーティリティ.py
- 走る
- b
- main.py
- ユーティリティ.py
でa/run/main1.py
:
でa/utils.py
:
でb/main.py
:
でb/utils.py
:
これが現在の結果です。最初の行に「hello from a」を出力したいと思います。