Импорт кода из динамически созданного модуля в Python

У меня есть проект, который пытается создать новый модуль динамически, а затем в последующем exec оператор пытается импортировать этот модуль.

import imp

s="""
class MyClass(object):
    def __init__(self):
        pass
    def foo(self):
        pass
"""

mod = imp.new_module("testmodule.testA")
exec s in mod.__dict__

exec "import testmodule.testA"

Но это бросает это исключение:

Traceback (most recent call last):
File "test.py", line 14, in <module>
exec "import testmodule.testA"
File "<string>", line 1, in <module>
ImportError: No module named testmodule.testA

Я пробовал несколько вещей: добавление его в sys.modules, создание scope dict, содержащий имя и модуль. Но не игра в кости. Я вижу testmodule.testA, когда делаю print locals() в моем exec заявление, но я не могу импортировать его. Что мне здесь не хватает?

Спасибо.

1 ответ

Вам нужно будет добавить свой модуль в sys.modules структура для import найти его:

import sys
sys.modules['testmodule.testA'] = mod

Однако у вас уже есть объект модуля, и нет смысла его снова импортировать. mod является ссылкой на то, что Python иначе "импортирует" уже.

Следующее будет работать без import вызов:

mod.MyClass

Если вам нужен модуль в exec вызовите, добавьте его в пространство имен:

exec 'instance = MyClass()' in {'MyClass': mod.MyClass}
Другие вопросы по тегам