如何从内存动态导入Python模块并获取其变量(不生成临时文件)
在内存中导入Python模块并获取变量(无需临时文件)
没问题,这事儿咱们完全可以在内存里搞定,不用创建任何临时文件。Python的标准库就提供了现成的工具,下面给你两种实用的方案:
方案1:直接创建模块对象并执行代码
这种方法简单直接,核心思路是先创建一个空的模块实例,再把内存中的代码字符串执行到这个模块的命名空间里,之后就能像访问普通模块变量一样操作了。
import types # 你的内存中的模块代码字符串 module_code = """ import smth aaa = {'mykey1':'myval1','mykey2':'myval2','mykey3':'myval3','mykey4':'myval4'} bbb = ['mykey1', 'mykey2'] ccc = 'some string' ddd = 17 #eee = 18 """ # 给你的内存模块起个名字(随便起,方便识别) module_name = "my_in_memory_module" # 创建一个空的模块对象 memory_module = types.ModuleType(module_name) # 把代码执行到模块的命名空间中 exec(module_code, memory_module.__dict__) # 现在就可以访问模块里的变量了! print(memory_module.aaa) # 输出: {'mykey1':'myval1', ...} print(memory_module.bbb) # 输出: ['mykey1', 'mykey2'] print(memory_module.ccc) # 输出: 'some string' print(memory_module.ddd) # 输出: 17
方案2:用importlib规范流程(支持后续导入)
如果你希望这个内存模块能像普通模块一样被import语句引用,可以用importlib模块来实现,更贴近Python的原生导入机制:
import importlib.util import sys # 你的内存中的模块代码字符串 module_code = """ import smth aaa = {'mykey1':'myval1','mykey2':'myval2','mykey3':'myval3','mykey4':'myval4'} bbb = ['mykey1', 'mykey2'] ccc = 'some string' ddd = 17 #eee = 18 """ module_name = "my_in_memory_module" # 创建模块规范(标记来源为内存) spec = importlib.util.spec_from_loader( module_name, None, origin='memory' ) # 从规范创建模块对象 memory_module = importlib.util.module_from_spec(spec) # 执行代码到模块命名空间 exec(module_code, memory_module.__dict__) # 把模块注册到sys.modules,这样后续可以用import导入 sys.modules[module_name] = memory_module # 现在你可以像导入普通模块一样用它了 import my_in_memory_module print(my_in_memory_module.aaa)
注意事项
- 代码中如果有
import smth这类外部模块导入,确保这些模块已经安装且能被Python找到,否则会抛出导入错误。 - 用
exec执行代码时,要确保代码是可信的,避免执行恶意代码带来安全风险。
内容的提问来源于stack exchange,提问作者user2678074
相关产品推荐
相关产品推荐

