パッケージ名が実行時にのみ認識されている場合、__ 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')
の別の言い方だと思っていました。
グローバル引数を追加するだけで十分です。
__import__('messages_en', globals=globals())
実際、__name__
ここで必要です:
__import__('messages_en', globals={"__name__": __name__})
パスの問題である場合は、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.
__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
必ずmodulesディレクトリをpythonパスに追加してください。
パス(ディレクトリのリストPythonはモジュールとファイルの検索に使用されます)はsysモジュールのpath属性に格納されます。パスはリストであるため、appendメソッドを使用してパスに新しいディレクトリを追加します。
たとえば、ディレクトリ/ home/me/mypyをパスに追加するには次のようにします。
import sys
sys.path.append("/home/me/mypy")
この質問は__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をインポートします)。
あなたはこれを試すことができます:
messages == __import__('Foo.messages_en', fromlist=['messages_en'])
動的パッケージパスの最上位パッケージを手動でインポートする必要があります。
たとえば、ファイルの先頭に次のように記述します。
import sites
その後、コードの後半でこれは私のために機能します:
target = 'some.dynamic.path'
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target])