如何无需文件直接实现Python中import..as的字符串代码导入?
无需本地文件实现字符串代码的导入别名效果
不用创建本地文件也能实现类似import codemod as cm的效果,下面给你两种实用方法:
方法1:用exec+模块对象实现别名
通过types.ModuleType创建一个空模块对象,把代码执行到这个模块的命名空间里,直接把模块对象赋值给别名cm即可,完全隔离当前环境:
import types # 示例模块代码字符串 code = """ def hello(): print("Hello from dynamic module!") PI = 3.14159 """ # 创建名为codemod的模块对象 cm = types.ModuleType("codemod") # 将代码执行到模块的命名空间中 exec(code, cm.__dict__) # 直接用cm调用模块内容 cm.hello() # 输出 Hello from dynamic module! print(cm.PI) # 输出 3.14159
这种方法简单直接,和正常导入的模块用法完全一致,还不会污染当前的全局命名空间。
方法2:用importlib构建标准模块并设置别名
如果需要更贴近原生导入的流程,或者要让模块能被其他地方导入,可以用importlib.util工具链:
import importlib.util import sys code = """ def add(a, b): return a + b CONST = 100 """ # 创建模块规格 spec = importlib.util.spec_from_loader("codemod", loader=None) # 基于规格创建模块对象 cm = importlib.util.module_from_spec(spec) # 执行代码到模块命名空间 exec(code, cm.__dict__) # 可选:把模块加入sys.modules,之后可以用import codemod导入 sys.modules["codemod"] = cm # 使用别名cm调用功能 print(cm.add(2, 3)) # 输出 5 print(cm.CONST) # 输出 100
注意点
直接exec(code)是在当前命名空间执行代码,会把函数、变量直接暴露在当前环境里;而上面两种方法都是把代码隔离在独立的模块命名空间中,和import codemod as cm的效果完全一致,还能避免命名冲突。
内容的提问来源于stack exchange,提问作者holistone
相关产品推荐
相关产品推荐

