4

Python パッケージ内の親ディレクトリにある (パス上にない) ファイルを子ディレクトリのファイルにインポートするにはどうすればよいですか?

私はPythonパッケージングの語彙について完全に明確ではないので、例として:

dir1/
    __init__.py
    runner.py
    in_dir1.py
    dir2/
        __init__.py
        in_dir2.py

dir1/in_dir1.py:

def example():
    print "Hello from dir1/in_dir1.example()"

dir1/dir2/in_dir2.py

import in_dir1   #or whatever this should be to make this work
print "Inside in_dir2.py, calling in_dir1.example()"
print in_dir1.example()

それがpythonパス上にないことを考えると、にインポートするdir1最良の方法を探しています。in_dir1in_dir2

from .. import in_dir1この Q/Aにfrom ..dir1 import in_dir1 基づいて試してみましたが、どちらも機能しません。その意図を実行する正しい方法は何ですか? この Q/Aには答えが含まれているようです。ただし、どうすればいいのか、PEP 366を使用して実際に問題を解決する方法がよくわかりません

両方の__init__.pyファイルは空で、私はv2.6を使用しています。

私は、Google が見つけ続けているパス ハックを使用せずに、これを実行しようとしています。

4

2 に答える 2

2

答えはあなたが与えたリンクにあります:

相対インポートでは、モジュールの__name__属性を使用して、パッケージ階層内でのそのモジュールの位置を決定します。モジュールの名前にパッケージ情報が含まれていない場合(たとえば、「main」に設定されている場合)、相対インポートは、モジュールがファイルシステムの実際の場所にあるかどうかに関係なく、モジュールが最上位モジュールであるかのように解決されます。

スクリプトで相対インポートを実行することはできません__main__(つまり、直接実行する場合python in_dir2.py)。

これを解決するために、PEP 366でできることは、グローバルに設定することです__package__

import dir1
if __name__ == '__main__':
    __package__ = 'dir1.dir2'
    from .. import in_dir1

パッケージdir1はまだオンになっている必要があることに注意してくださいsys.path!これを達成するために操作することができますsys.path。しかし、それまでに、絶対輸入に対して何を達成しましたか?

于 2012-01-25T22:49:57.363 に答える
0

実際にこれを行うことができます:

import sys
sys.path.append('..')

そしてそれはうまくいくでしょう。しかし、そうしないでください。他のモジュールが破損する可能性があります。

インポート後に直接削除できると思いますが、そうしないでください。

編集:

実際、これも機能し、安全ではない理由はないと思います。

in_dir2.py 内で次のことができます。

import sys
import os
current_module = sys.modules[__name__]
indir2file=current_module.__file__
sys.path.append(os.path.dirname(os.path.abspath(indir2file))+os.sep+".."+os.sep)
import in_dir1

代わりに、コードを再構築するように努めてください。

于 2012-01-25T22:57:53.733 に答える