我根据PEP 302编写了一个导入钩子,除了一个令人讨厌的细节外,它似乎工作得很好。 当出现导入错误时,比如尝试导入不存在的模块的代码,我会得到一个跟踪行,例如:
File "<string>", line 10, in helloEnv
第10行是对不存在的导入的调用所在,但没有文件名,只有<string>
。
我的导入钩子看起来非常像PEP 302中的最小钩子。在创建模块时,我总是将正确的字符串值设置为__file__
,甚至检查new_module()
是否将正确的值设置为__name__
。此外,模块的str()
和repr()
都会返回信息。
引用中的这些无名文件使得调试导入错误变得很困难。引用从哪里获取其文件名?为什么不看模块的名称?
exec()
执行的。是否可以给exec()
一个文件名?
答案 0 :(得分:0)
好的,这很简单。而不是
exec(code, mod.__dict__)
写:
exec(compile(code, fullname, "exec"), mod.__dict__)