Python, импортировать строку кода Python в качестве модуля

В python вы можете сделать что-то подобное, чтобы импортировать модуль, используя имя файла строки, и назначьте его пространство имен переменной в локальном пространстве имен.

x = __import__(str)

Мне интересно, есть ли связанная с этим функция, которая возьмет строку кода Python вместо пути к файлу с кодом Python и вернет его пространство имен как переменную.

Например,

str = "a = 5";
x = importstr(str)
print x.a
#output is 5

Я понимаю, что я могу написать строку в файл, а затем использовать __import__, но я бы хотел пропустить промежуточный файл, если это возможно.

Причина этого в том, что я экспериментирую с метапрограммированием в python, и это похоже на хорошее решение того, что я делаю.

Ответ 1

Здесь пример динамического создания объектов модуля с помощью imp module

Ответ 2

Здесь как импортировать строку в качестве модуля:

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

Ответ 3

К сожалению, модуль 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

Ответ 4

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

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