Как импортировать пакет с помощью __import __(), когда имя пакета известно только во время выполнения?

У меня есть папка сообщений (пакет) с файлом __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')

Ответы

Ответ 1

Добавление аргумента globals для меня достаточно:

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

Фактически, здесь требуется только __name__:

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

Ответ 2

Если это проблема пути, вы должны использовать аргумент 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.

Ответ 3

__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

Ответ 4

Обязательно добавьте каталог модулей в свой путь к python.

Ваш путь (список каталогов, которые Python выполняет для поиска модулей и файлов) хранится в атрибуте path модуля sys. Поскольку путь - это список, вы можете использовать метод append для добавления новых каталогов в путь.

Например, чтобы добавить каталог /home/me/mypy в путь:

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

Ответ 5

Вы можете попробовать следующее:

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

Ответ 6

Вам нужно вручную импортировать верхний пакет вашего пути динамического пакета.

Например, в начале файла я пишу:

import sites

а затем в коде это работает для меня:

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