10

そのため、Stack Overflow で同様の質問をいくつか見ましたが、私の問題や一般的なケースに対処するものは何もないようです。ですから、うまくいけば、この質問がそれを修正し、私の頭痛を止めます. 次の形式の git リポジトリがあります。

repo/
   __init__.py
   sub1/
      __init__.py
      sub1a/
         __init.py
         mod1.py
   sub2/
      __init__.py
      mod2.py

mod1.py から mod2.py をインポートするにはどうすればよいですか? また、mod1.py または mod2.py がスクリプトであるかどうかによって、これはどのように変化しますか?

4

3 に答える 3

3

Python 2.6 以降を使用している場合は、次の 2 つの選択肢があります。

  • 相対輸入
  • あなたに追加repoするPYTHONPATH

相対インポートでは、特別なドット構文が使用されます。

パッケージsub1:

from .sub2.mod2 import thing

パッケージsub1aで:

from ..sub2.mod2 import otherthing

単純なインポート ステートメント ( import module) は、相対インポートでは機能しないことに注意してください。

より良い解決策は、Python パスが正しく設定された絶対インポートを使用することです (例を に示しますbash)。

export PYTHONPATH=/where/your/project/is:$PYTHONPATH

より詳しい情報:

于 2013-05-03T06:29:07.920 に答える
0

スクリプトまたはモジュールは、次のいずれかのモジュールをインポートできます。

  1. システム パス上、または
  2. インポートするスクリプト/モジュールと同じパッケージの一部。

モジュールの場合、これらのルールは例外なく適用されます。スクリプトにはルールが適用されますが、問題は、スクリプトを実行すると、デフォルトではパッケージの一部とは見なされないことです。

つまり、デフォルトでは、スクリプトはシステム パス上にあるモジュールのみをインポートできます。デフォルトでは、パスには現在のディレクトリが含まれているため、スクリプトを実行すると、同じディレクトリ内のモジュールまたはサブディレクトリであるパッケージをインポートできます。しかし、それだけです。スクリプトには、ディレクトリ ツリー内の "どこにあるか" という概念がないため、含まれているディレクトリに関する特定の相対パス情報を必要とするインポートを行うことはできません。つまり、「親ディレクトリから」または「兄弟ディレクトリから」のものをインポートすることはできません。これらのディレクトリにあるものは、システム パス上にある場合にのみインポートできます。

パッケージ内にあることをスクリプトに「認識」させたい場合は、それに__package__属性を与えることができます。この前の質問を参照してください。from ...sub2 import mod2その後、通常、そのスクリプト内から明示的な相対インポート (例: ) を使用できます。

于 2013-05-03T06:39:58.987 に答える