【发布时间】:2015-01-09 06:17:20
【问题描述】:
我正在尝试调试导致sys.modules['numpy'] 被覆盖的问题。我在numpy.__init__ 中添加了一些打印语句,当我尝试导入 numpy 时,我得到了以下输出:
numpy.__init__ running
id(sys.modules) = 89034704
id(sys.modules['numpy']) = 161528304
numpy.__init__ running
id(sys.modules) = 89034704
id(sys.modules['numpy']) = 177135864
Numpy 有许多循环导入,它们应该按照this answer 中的描述工作。但就我而言,不是从sys.modules 获取部分初始化的numpy 模块,而是再次导入numpy,然后再次执行numpy.__init__,导致崩溃。
我如何检测 sys.modules 以了解谁在覆盖 sys.modules['numpy'] 以及何时覆盖? 通常我会编写一个 dict 子类,但我认为更改 @ 并不安全987654331@ 指向我自己的对象。我尝试覆盖sys.modules.__setattr__,但这是一个只读属性。
上下文:我正在尝试在 Julia 库 PyCall 中调试 this issue。 PyCall 将 Python 解释器嵌入到正在运行的 Julia 进程中,并将导入委托给来自 cpython 的 PyImport_ImportModule。上面的问题发生在对PyImport_ImportModule 的一次调用中,所以我希望这个问题应该可以用python / cpython 的知识来回答,但不需要Julia / PyCall 的知识。
【问题讨论】:
-
我会首先尝试仅在 Python 中重现该错误,而不涉及 Julia(或者,理想情况下,直接 C API 调用)。你有可以做到这一点的示例 Python 代码吗?
-
this question 的答案建议覆盖
__import__可能会起作用。我怀疑问题是由于某种路径混淆造成的。