Как динамически импортировать класс из модуля из пакета? - PullRequest
2 голосов
/ 26 августа 2010

Это, наверное, действительно просто, но я этого не понимаю.Следующие работы:

foo.py

class Foo:
    pass

bar.py

module = __import__('foo')
foo = module.__dict__['Foo']

Впоследствии foo - это класс foo.Foo, как и ожидалось.


Тем не менее, если я помещу a.py в пакет, он перестает работать:

qux / __ init __. Py

(пустой файл)

qux / foo.py

class Foo:
    pass

bar.py

module = __import__('qux.foo')
foo = module.__dict__['Foo']

Запуск python bar.py дает мне KeyError: 'Foo', но импорт модуля все еще успешен.

Что происходит, и как мне заставить его работать?

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

__import__, примененное к именам вложенных модулей, возвращает модуль / пакет верхнего уровня - здесь qux.Однако все модули вставляются в sys.modules, поэтому вы можете просто найти там qux.foo.

См. PyDoc на __import__() - там все описано.

2 голосов
/ 26 августа 2010

Если вы хотите импортировать подмодуль, вы можете сделать что-то вроде этого:

package = __import__('qux', fromlist=['foo'])
module = getattr(package, 'foo')

Обратите внимание, что с fromlist __import__ возвращает наиболее вложенное имя в первом параметре, поэтому вы можете заменить baz.bar.qux в вызове __import__ для доступа к модулю baz.bar.qux.foo.

1 голос
/ 19 января 2012

Вы можете получить прямой доступ к модулю, вложенному или нет, используя importlib:

import importlib
module_name="qux.foo"
mod=importlib.import_module(module_name)

См. http://docs.python.org/dev/library/importlib.html для получения дополнительной информации.

1 голос
/ 26 августа 2010

Вам необходимо использовать параметр fromlist для ссылки на подмодуль:

temp = __import__('qux.foo', globals(), locals(), ['Foo'], -1)
foo = temp.Foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...