Python, импорт строки кода Python в качестве модуля
в python вы можете сделать что-то вроде этого, чтобы импортировать модуль с помощью имени файла строки и назначить его пространству имен переменную в локальном пространстве имен.
x = __import__(str)
мне интересно, есть ли связанная функция, которая будет принимать строку кода Python вместо пути к файлу с кодом Python и возвращать его пространство имен в качестве переменной.
например,
str = "a = 5";
x = importstr(str)
print x.a
#output is 5
Я понимаю, что могу записать строку в файл, а затем использовать __import__
на нем, но Я хотел бы пропустить промежуточный файл, если это возможно.
причина этого в том, что я экспериментирую с метапрограммированием на python, и это кажется хорошим решением того, что я делаю.
4 ответов
здесь пример динамического создания объектов модуля с помощью модуль imp
здесь как импортировать строку в качестве модуля:
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 ' s RuntimeModule.from_string
:
from pyext import RuntimeModule
mod = RuntimeModule.from_string('a = 1')
print(mod.a) # 1