Python,导入Python代码的字符串作为模块

时间:2010-09-01 01:56:18

标签: python metaprogramming

在python中,您可以执行以下操作,使用字符串文件名导入模块,并在本地名称空间中为其命名空间分配变量。

x = __import__(str)

我想知道是否有一个相关的函数需要接受一串Python代码,而不是使用Python代码的文件路径,并将其命名空间作为变量返回。

例如,

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

我意识到我可以将字符串写入文件,然后在其上使用__import__,但如果可能的话我想跳过中间文件。

这样做的原因是我在python中尝试元编程,这似乎是我正在做的一个很好的解决方案。

5 个答案:

答案 0 :(得分:14)

这是使用example

动态创建模块对象的imp module

答案 1 :(得分: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

答案 2 :(得分:5)

不幸的是,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

答案 3 :(得分:2)

这是你要找的东西吗?

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

答案 4 :(得分:1)

根据{{​​3}}上的Python文档,不建议使用

types.ModuleType:

importlib.util.module_from_spec(spec)

...

此功能优于使用types.ModuleType来创建新模块,因为spec用于在模块上设置尽可能多的导入控制属性。

这是我想从源代码加载模块的方法。

import importlib.util
spec = importlib.util.spec_from_loader('helper', loader=None)
helper = importlib.util.module_from_spec(spec)
exec('a = 5', helper.__dict__)

print(type(helper)) # prints "<class 'module'>"
helper.a # prints "5"