2009-06-29 10 views
15

__init__.pyファイルと別のモジュールmessages_en.pyのメッセージフォルダ(パッケージ)があります。 __init__.pyで、私はそれが動作messages_enインポートする場合、しかし__import__は「はImportError:いいえモジュールの名前messages_en」で失敗し、私は「輸入X」を考えるために使用さパッケージ名が実行時にのみ判明している場合、__import __()を使用してパッケージをインポートするにはどうすればよいですか?

import messages_en # it works 
messages = __import__('messages_en') # it doesn't ? 

__import__('x')

答えて

14

は私のために十分である:

実際に
__import__('messages_en', globals=globals()) 

、唯一__name__ですここに必要:

14

__import__があるというのがもうひとつの方法でありますimport文によって呼び出される内部関数。

たとえば、次の文を次のコードに似たバイトコードでimport spam結果:オン

spam = __import__('spam', globals(), locals(), [], -1) 

日常で必要な(またはしたい)Pythonドキュメントから__import__

を呼び出すことはありませんコーディング一方、声明

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1) 
eggs = _temp.eggs 
saus = _temp.sausage 

詳細でfrom spam.ham import eggs, sausage as saus結果:それはパスの問題がある場合は0 http://docs.python.org/library/functions.html

+1

+1と説明のために感謝していますが、正確な理由を説明できOPの例がうまくいかない?彼はメッセージにメッセージエイリアンをエイリアスしようとしているようだ。 –

+0

「wr」はレベルによるものだと私は知っていましたが、通常は使用しないでください。この場合、設定ファイルから言語を読み込み、メッセージに追加してそのファイルをインポートする必要があります。 –

+0

この例は、特に、サブディレクトリからモジュールをロードしようとしている場合は、それは私の "属性が見つかりません"エラーを修正するのに役立ちました。 – Carlos

19

、あなたは(docsから)level引数を使用する必要があります。

messages == __import__('Foo.messages_en', fromlist=['messages_en']) 
+2

しかし、デフォルトのレベルは-1であり、私はまだ-1を渡しているので、理由は何だったのだろうか?余分なのはグローバル/ローカルのdictだ。違いがどうなるのか –

+0

なぜこれが受け入れられるのだろう?質問に答えたり、問題を解決したりすることもありません。 – kynan

+0

この回答は間違っています。 OPの問題は決して「レベル」に関係していません。それを修正するための2つのオプション:Ericが指摘するようにモジュールのグローバルを 'messages = __import __( 'messages_en'、globals())'と指定するか、Lennartが提案するようにパッケージ名を指定します。 Python 3では – kynan

0

あなたは、これが試みることができますあなたのpythonパスに。

パス(Pythonがモジュールとファイルを検索するディレクトリのリスト)は、sysモジュールのpath属性に格納されます。パスはリストなので、appendメソッドを使用して新しいディレクトリをパスに追加することができます。例えば

、パスにディレクトリ/ home /私/ mypyを追加するには:グローバル引数を追加

import sys 
sys.path.append("/home/me/mypy") 
3

modulesディレクトリを追加してください:

__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module 

Level is used to determine whether to perform 
absolute or relative imports. -1 is the original strategy of attempting 
both absolute and relative imports, 0 is absolute, a positive number 
is the number of parent directories to search relative to the current module. 
+1

パッケージを再配置不可能にするので安全ではありません。パッケージがこのハードコーディングされたパスにある場合にのみ機能します。 – kynan

0

ダイナミックパッケージパスのトップパッケージを手動でインポートする必要があります。私が書くファイルの先頭で例えば

import sites 

その後のコードでは、これは私の作品:

target = 'some.dynamic.path' 
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target]) 
関連する問題