web-dev-qa-db-ja.com

パッケージ名が実行時にのみ認識されている場合、__ import __()を使用してパッケージをインポートするにはどうすればよいですか?

___init__.py_ファイルとその中に別のモジュール_messages_en.py_が入ったメッセージフォルダ(パッケージ)があります。 ___init__.py_で_messages_en_をインポートすると機能しますが、___import___は「ImportError:No modulenamedmessages_en」で失敗します

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

以前は、「importx」は__import__('x')の別の言い方だと思っていました。

15
Anurag Uniyal

グローバル引数を追加するだけで十分です。

__import__('messages_en', globals=globals())

実際、__name__ここで必要です:

__import__('messages_en', globals={"__name__": __name__})
19
Eric

パスの問題である場合は、level引数を使用する必要があります( docs から):

__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.
19
wr.

__import__は、importステートメントによって呼び出される内部関数です。日常のコーディングでは、__import__を呼び出す必要はありません(またはしたくない)

pythonドキュメント:

たとえば、ステートメントimport spamは、次のコードのようなバイトコードになります。

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

一方、ステートメントfrom spam.ham import eggs, sausage as sausは次のようになります。

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

詳細: http://docs.python.org/library/functions.html

14
Perica Zivkovic

必ずmodulesディレクトリをpythonパスに追加してください。

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

たとえば、ディレクトリ/ home/me/mypyをパスに追加するには次のようにします。

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

この質問は__import__()関数に関するものであることを理解していますが、アドバイスに従ってPython 2.7以上を使用している場合は、importlibパッケージがランタイムパッケージのインポートに最適だと思います doc

注:モジュールのプログラムによるインポートでは、この関数の代わりにimport_module()を使用する必要があります。

考えられる落とし穴: これはpython 2.7: で導入されました

バージョン2.7の新機能。

このモジュールは、インポートの完全な実装を提供するPython 3.1からの同じ名前のよりフル機能のパッケージで利用可能なもののマイナーサブセットです。ここにあるものは、簡単にするために提供されています2.7から3.1への移行中。

あなたの場合、あなたは使用することができます:

_import importlib

messages = importlib.import_module('messages_en')
_

また、パッケージ名を指定する場合は、_from messages import messages_en_は次のように記述できます。

importlib.import_module('.messages_en', 'messages')

説明されているように、相対パス解決に使用される_._の_.messages_en_に注意してください ここ

... name引数は、どのモジュールを絶対的または相対的な用語でインポートするかを指定します(たとえば、pkg.modまたは..modのいずれか)。名前が相対的な用語で指定されている場合、package引数は、パッケージ名を解決するためのアンカーとして機能するパッケージの名前に設定する必要があります(例:import_module( '.. mod'、 'pkg.subpkg') pkg.modをインポートします)。

2
Chukwuemeka

あなたはこれを試すことができます:

messages == __import__('Foo.messages_en', fromlist=['messages_en'])
0
Lennart Regebro

動的パッケージパスの最上位パッケージを手動でインポートする必要があります。

たとえば、ファイルの先頭に次のように記述します。

import sites

その後、コードの後半でこれは私のために機能します:

target = 'some.dynamic.path'
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target])
0
Mikhail Savinov