2010-09-01 2 views
15

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

x = __import__(str) 

Я интересно, если есть родственный функция, которая будет принимать принимать строку кода на Python, а путь к файлу с кодом Python, и возвращает его пространство имен в качестве переменной.

Например,

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

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

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

ответ

13

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

+1

Да, правильно. –

+0

hrm ... получил мой первый опрос с этим ответом, и я не уверен, почему? –

+0

@JeremyBrown только то, что я искал. Поскольку я проголосовал за это, считайте, что голосование отменено;) –

2

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

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

я предпочел бы не нужно ссылаться на пункты пространства имен, используя строку – Mike

5

Вот как импортировать строку как модуль:

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 «s RuntimeModule.from_string:

from pyext import RuntimeModule 

mod = RuntimeModule.from_string('a = 1') 
print(mod.a) # 1 
Смежные вопросы