我根据PEP 302编写了一个导入钩子,除了一个烦人的细节外,它似乎工作正常。当出现导入错误时,比如说尝试导入不存在的模块的代码,我会得到一个引用,如下所示:
File "<string>", line 10, in helloEnv
第 10 行是对不存在的导入的调用所在的位置,但没有文件名,只有<string>
.
我的导入钩子看起来很像PEP 302中的最小钩子。在创建模块时,我总是将正确的字符串值设置为__file__
,甚至检查是否new_module()
将正确的值设置为__name__
. 此外,模块的 和 都str()
返回repr()
一些信息。
trackback 中的这些无名文件使调试导入错误变得困难。引用从哪里获取文件名?为什么它看不到模块的名称?
编辑 - 再想一想,可能是因为模块代码是使用exec()
. 是否可以提供exec()
文件名?