1

我根据PEP 302编写了一个导入钩子,除了一个烦人的细节外,它似乎工作正常。当出现导入错误时,比如说尝试导入不存在的模块的代码,我会得到一个引用,如下所示:

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

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

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


编辑 - 再想一想,可能是因为模块代码是使用exec(). 是否可以提供exec()文件名?

4

1 回答 1

0

好的,这很简单。代替

exec(code, mod.__dict__)

写:

exec(compile(code, fullname, "exec"), mod.__dict__)
于 2012-05-10T09:39:35.893 回答