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

это то, что вы ищете ?

my_namespace = {}
exec "a = 5" in my_namespace
print my_namespace["a"]