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

21 投票
5 回答
11968 浏览
提问于 2025-04-16 03:33

在Python中,你可以用类似下面的方式,通过一个字符串文件名来导入一个模块,并把它的命名空间赋值给本地的一个变量。

x = __import__(str)

我在想,是否有一个相关的函数,可以接受一段Python代码的字符串,而不是指向一个包含Python代码的文件的路径,并将它的命名空间作为一个变量返回。

举个例子,

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

我知道我可以把这个字符串写入一个文件,然后用__import__来导入它,但如果可以的话,我希望能跳过这个中间文件的步骤。

这样做的原因是,我正在尝试在Python中进行元编程,这似乎是我正在做的事情的一个好解决方案。

5 个回答

6

下面是如何将一个字符串当作模块导入

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
7

很遗憾,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

或者你可以使用PyExtRuntimeModule.from_string

from pyext import RuntimeModule

mod = RuntimeModule.from_string('a = 1')
print(mod.a) # 1
15

这里有一个示例,展示了如何使用imp模块动态创建模块对象。

撰写回答