31

pモジュールaとを含むパッケージがありますbaに依存していbます:

b.pyコンテンツ:

import a

ただし、からのモジュールだけでなく、同じパッケージディレクトリからモジュールをインポートするようにしたいです。bapaPYTHONPATH

だから私はb.py次のように変更しようとしています:

from . import a

これは、パッケージディレクトリbの外にいるときにインポートする限り機能します。p次のファイルがあるとします。

/tmp
    /p
       a.py
       b.py
       __init__.py

次の作品:

$ cd /tmp
$ echo 'import p.b' | python

以下は機能しません。

$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "b.py", line 1, in <module>
    from . import a
ValueError: Attempted relative import in non-package

なんで?

PS私はPython2.7.3を使用しています

4

3 に答える 3

15

Python import documentationを読み直した後、元の問題に対する正しい答えは次のとおりです。

独自のパッケージからのbインポートを確実に行うには、次のように.ab

import a

ドキュメントからの引用は次のとおりです。

多くの場合、サブモジュールは相互に参照する必要があります。たとえば、サラウンド モジュールはエコー モジュールを使用する場合があります。実際、そのような参照は非常に一般的であるため、import ステートメントは、標準モジュールの検索パスを調べる前に、最初に含まれているパッケージを調べます。

注:以下のコメントで JF Sebastian が示唆しているように、暗黙的なインポートの使用は推奨されておらず、実際、Python 3 では廃止されています。

于 2013-01-08T14:19:23.787 に答える
5

__init__.pyにファイルがあるからです/p。このファイルは Python に「このフォルダー内のすべてのモジュールはパッケージ内にあります」と伝えますp

ファイルが存在する限り、どこにいてもとして__init__.pyインポートできます。bp.b

したがって、正しいインポートは次のようにb.pyなります。import p.a

于 2013-01-08T13:42:54.373 に答える
0

相対インポートはパッケージ内でのみ機能します。

現在の場所からインポートする場合b、パッケージの概念がないため、相対インポートする方法はありません。

インポートする場合は、パッケージ内のp.bモジュールです。bc

重要なのはディレクトリ構造ではなく、パッケージ構造です。

于 2013-01-08T13:45:13.057 に答える