导入后任意修改导入一个python模块
Arbitrarily modify and import a python module after importing
首先,我使用 importlib 修改导入并试图找到修改导入文件的解决方案。
我看到一个 建议你可以使用这段代码
任意修改导入的模块
def modify_and_import(module_name, package):
spec = importlib.util.find_spec(module_name, package)
source = spec.loader.get_source(module_name)
new_source = tokens.tokenize(source)
module = importlib.util.module_from_spec(spec)
codeobj = compile(new_source, module.__spec__.origin, 'exec')
exec(codeobj, module.__dict__)
sys.modules[module_name] = module
return module
现在我运行它用下面的调用
o = modify_and_import('o', "./o.xran")
但是,运行 它通过 exec 给了我以下错误
AttributeError: 'NoneType' object has no attribute 'loader'
然后我尝试打印 'spec' 但得到 None 所以,我认为规范正在返回,而名为 o.xran 的文件存在。
兄弟,在文本编辑器中打开修改后的模块,在打开项目的同一 window 中,然后在项目中使用导入它,'from import *'..希望它能工作..谢谢
好的,一天后我终于让它工作了,因为我只处理本地文件,所以我根本不需要使用 imp。这是我的最终代码
with open(module_name) as f:
source = f.read()
source = tokens.tokenize(source)
module = types.ModuleType(module_name)
exec(source, module.__dict__)
sys.modules[module_name] = module
return module
感谢任何回答或尝试做出贡献的人。
首先,我使用 importlib 修改导入并试图找到修改导入文件的解决方案。
我看到一个
def modify_and_import(module_name, package):
spec = importlib.util.find_spec(module_name, package)
source = spec.loader.get_source(module_name)
new_source = tokens.tokenize(source)
module = importlib.util.module_from_spec(spec)
codeobj = compile(new_source, module.__spec__.origin, 'exec')
exec(codeobj, module.__dict__)
sys.modules[module_name] = module
return module
现在我运行它用下面的调用
o = modify_and_import('o', "./o.xran")
但是,运行 它通过 exec 给了我以下错误
AttributeError: 'NoneType' object has no attribute 'loader'
然后我尝试打印 'spec' 但得到 None 所以,我认为规范正在返回,而名为 o.xran 的文件存在。
兄弟,在文本编辑器中打开修改后的模块,在打开项目的同一 window 中,然后在项目中使用导入它,'from import *'..希望它能工作..谢谢
好的,一天后我终于让它工作了,因为我只处理本地文件,所以我根本不需要使用 imp。这是我的最终代码
with open(module_name) as f:
source = f.read()
source = tokens.tokenize(source)
module = types.ModuleType(module_name)
exec(source, module.__dict__)
sys.modules[module_name] = module
return module
感谢任何回答或尝试做出贡献的人。