22

次の python ソース ファイル レイアウトがあるとします。

lib/foo.py
lib/foo/bar.py

そして、私のソースコードで:

from foo import gaz

インポート エラーが発生します。

ImportError: No module named foo

次のことを実行できるように、.py ファイルと同じ名前のディレクトリを作成するにはどうすればよいですか。

 from foo import gaz
 from foo.bar import wakawaka

前もって感謝します!

4

2 に答える 2

15

単一のインポートを使用して発生している実際の問題は、パッケージがモジュールよりも優先されるためです。

from package import itemを使用する場合、項目はパッケージのサブモジュール (またはサブパッケージ)、または関数、クラス、変数など、パッケージで定義された他の名前のいずれかであることに注意してください。このimport ステートメントは、最初に項目がパッケージで定義されているかどうかをテストします。そうでない場合は、それがモジュールであると想定し、ロードを試みます。見つからない場合は、ImportError例外が発生します。

とにかく、特定の名前で複数のモジュールをインポートすることはできないため、ファイルまたはディレクトリの名前を変更することを強くお勧めします。この問題は、各モジュール/パッケージ オブジェクトが に格納されているために発生します。これは単純なため、複数の等しいキーを含めることはできません。sys.modulesdict

foo.py特に、と ディレクトリが別のディレクトリにあると仮定するとfoo(そうでない場合はまだ import できませんfoo.py)、次の場合:

from foo import gaz

foo.pyモジュールをロードしてに配置しsys.modules、次のことを試みます。

from foo.bar import wakaka

foo.pyインポートはパッケージではなくモジュールを使用しようとするため、失敗します。

最初にインポートすると、逆のことが起こりますfoo.bar。インポートはモジュールの代わりにパッケージを使用します。

于 2013-04-26T21:16:17.110 に答える
2

これはあなたがすべきことではないと確信していますが、 Python にimpを使用して特定のファイルをモジュールとしてインポートさせることができます:

import imp

with open("foo.py") as source:
    foo = imp.load_module("foo", source, "./", ('', '', imp.PY_SOURCE))

今、あなたはできる:

gaz_instance = foo.gaz()
于 2013-04-26T21:54:46.840 に答える