Ответ 1
Добавление аргумента globals для меня достаточно:
__import__('messages_en', globals=globals())
Фактически, здесь требуется только __name__
:
__import__('messages_en', globals={"__name__": __name__})
У меня есть папка сообщений (пакет) с файлом __init__.py
и еще один модуль messages_en.py
внутри него. В __init__.py
, если я импортирую messages_en
, он работает, но __import__
терпит неудачу с "ImportError: No module named messages_en"
import messages_en # it works
messages = __import__('messages_en') # it doesn't ?
Раньше я думал, что "import x" - это еще один способ сказать __import__('x')
Добавление аргумента globals для меня достаточно:
__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
Дополнительная информация: http://docs.python.org/library/functions.html
Обязательно добавьте каталог модулей в свой путь к python.
Ваш путь (список каталогов, которые Python выполняет для поиска модулей и файлов) хранится в атрибуте path модуля sys. Поскольку путь - это список, вы можете использовать метод append для добавления новых каталогов в путь.
Например, чтобы добавить каталог /home/me/mypy в путь:
import sys
sys.path.append("/home/me/mypy")
Вы можете попробовать следующее:
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])