在python中,您可以执行以下操作,使用字符串文件名导入模块,并在本地名称空间中为其命名空间分配变量。
x = __import__(str)
我想知道是否有一个相关的函数需要接受一串Python代码,而不是使用Python代码的文件路径,并将其命名空间作为变量返回。
例如,
str = "a = 5";
x = importstr(str)
print x.a
#output is 5
我意识到我可以将字符串写入文件,然后在其上使用__import__
,但如果可能的话我想跳过中间文件。
这样做的原因是我在python中尝试元编程,这似乎是我正在做的一个很好的解决方案。
答案 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)
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"