Импорт кода из динамически созданного модуля в 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}