Ответ 1
Здесь пример динамического создания объектов модуля с помощью imp module
В python вы можете сделать что-то подобное, чтобы импортировать модуль, используя имя файла строки, и назначьте его пространство имен переменной в локальном пространстве имен.
x = __import__(str)
Мне интересно, есть ли связанная с этим функция, которая возьмет строку кода Python вместо пути к файлу с кодом Python и вернет его пространство имен как переменную.
Например,
str = "a = 5";
x = importstr(str)
print x.a
#output is 5
Я понимаю, что я могу написать строку в файл, а затем использовать __import__
, но я бы хотел пропустить промежуточный файл, если это возможно.
Причина этого в том, что я экспериментирую с метапрограммированием в python, и это похоже на хорошее решение того, что я делаю.
Здесь пример динамического создания объектов модуля с помощью imp module
Здесь как импортировать строку в качестве модуля:
import sys,imp
my_code = 'a = 5'
mymodule = imp.new_module('mymodule')
exec my_code in mymodule.__dict__
чтобы теперь вы могли получить доступ к атрибутам модуля (и функциям, классам и т.д.) следующим образом:
mymodule.a
>>> 5
Чтобы игнорировать следующую попытку импорта, добавьте модуль в sys
:
sys.modules['mymodule'] = mymodule
К сожалению, модуль imp
был недавно устаревшим (у меня нет идеи, почему).
Вместо этого вы должны сделать следующее:
from types import ModuleType
import sys
mod = ModuleType('my_module', 'doc string here')
exec('a = 1', mod.__dict__)
print(mod.a) # prints 1
# add to sys.modules
sys.modules['my_module'] = mod
Или вы можете использовать PyExt RuntimeModule.from_string
:
from pyext import RuntimeModule
mod = RuntimeModule.from_string('a = 1')
print(mod.a) # 1
Это то, что вы ищете?
my_namespace = {}
exec "a = 5" in my_namespace
print my_namespace["a"]