2013-05-03 7 views
6

私はスタックオーバーフローに関するいくつかの同様の質問を見てきましたが、何も私の問題、または一般的なケースに対処するようです。だから、うまくいけば、この問題はそれを修正し、頭痛を止める。 (ときPythonのSisterサブディレクトリからインポートするには?

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

私はmod1.pyおよびその逆からmod2.pyをインポートするにはどうすればよい、とどのようにこの変更はmod1.pyまたはmod2.pyはスクリプトがあるかどうかに依存しない:私は、フォームのGitのレポを持っていますそれぞれインポートしています - インポートされていません)?

答えて

6

最も簡単な解決策は、repoを含むディレクトリをPYTHONPATHに置き、次に絶対パスのインポートを使用することです。 import repo.sub2.mod2など。

あなたはそれはあなたが直接、任意のディレクトリからスクリプトとして両方のpythonファイルを起動しているケースをカバーしたい場合は他のソリューションには、いくつかの牛車を伴うために起こっている - 最も可能性の高いsys.path効果的PYTHONPATHを設定することと同じことを達成するためにマングリング、ユーザーに設定させる必要はありません。 、特殊なドット構文が使用されている相対的な輸入品を使用してPYTHONPATH

repoを追加

  • 相対輸入
+1

私はPYTHONPATHを編集しても問題ありませんが、これを強制する標準的な方法はありますか?私はレポの新しいユーザーのすべてが手作業でPYTHONPATHに入って更新する必要はありません。 – Eli

+1

人々が 'PYTHONPATH'自体を管理する必要がないようにするには、' sys.path' manglingを考慮する必要があります。 (例えば、 '__file__'と' os.abspath'を使ってスクリプトがどこにあるかを調べ、そのディレクトリの上に適切なレベルのレベルを 'repo'の親にし、' sys.path.insert 'それ。) – Amber

2

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

パッケージsub1:

パッケージSUB1Aで
from .sub2.mod2 import thing 

:プレーンimport文(import module)は相対的な輸入品では動作しないこと

from ..sub2.mod2 import otherthing 

注意。

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

詳細情報:

+0

私は本当にこれらの相対的なインポートが機能したかった。しかし、私のpython 2.7で、彼らは動作しません。 –

+0

Python 2.7を使用して、 'from sub2.mod2 import thing'のような文を使用して成功しました。 – coralvanda

0

スクリプトまたはモジュールは、システム・パス、またはインポートスクリプト/モジュールと同じパッケージの

  • 部分のいずれか

    1. ているモジュールをインポートすることができます。

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

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

    パッケージ内にあるスクリプトに「知っている」ようにするには、__package__という属性を付けることができます。 this previous questionを参照してください。そのスクリプト内から明示的な相対インポート(例:from ...sub2 import mod2)を使用することができます。

  • 関連する問題