Python导入钩子:导入错误的引用中没有文件名

时间:2012-05-10 09:28:18

标签: python import trackback import-hooks

我根据PEP 302编写了一个导入钩子,除了一个令人讨厌的细节外,它似乎工作得很好。 当出现导入错误时,比如尝试导入不存在的模块的代码,我会得到一个跟踪行,例如:

File "<string>", line 10, in helloEnv

第10行是对不存在的导入的调用所在,但没有文件名,只有<string>
我的导入钩子看起来非常像PEP 302中的最小钩子。在创建模块时,我总是将正确的字符串值设置为__file__,甚至检查new_module()是否将正确的值设置为__name__。此外,模块的str()repr()都会返回信息。

引用中的这些无名文件使得调试导入错误变得很困难。引用从哪里获取其文件名?为什么不看模块的名称?


编辑 - 再考虑一下,可能是因为模块代码是使用exec()执行的。是否可以给exec()一个文件名?

1 个答案:

答案 0 :(得分:0)

好的,这很简单。而不是

exec(code, mod.__dict__)

写:

exec(compile(code, fullname, "exec"), mod.__dict__)