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

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

x = __import__(str) 

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

Например,

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

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

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

Ниже приведен пример динамического создания объектов модуля с использованием модуля 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 

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

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

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

Или вы можете использовать RuntimeModule.from_string RuntimeModule.from_string :

 from pyext import RuntimeModule mod = RuntimeModule.from_string('a = 1') print(mod.a) # 1