gpt4 book ai didi

python - 如何调试被覆盖的 sys.modules 条目?

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:47 26 4
gpt4 key购买 nike

我正在尝试调试导致 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 子类,但我认为将 sys.modules 更改为指向我自己的对象是不安全的。我尝试覆盖 sys.modules.__setattr__,但这是一个只读属性。

上下文:我正在尝试调试 this issue在 PyCall 中,一个 Julia 库。 PyCall 在运行的 Julia 进程中嵌入了一个 Python 解释器,并将导入委托(delegate)给来自 cpython 的 PyImport_ImportModule。上面的问题发生在对 PyImport_ImportModule 的一次调用中,所以我希望这个问题应该可以用 python/cpython 的知识来回答,但不需要 Julia/PyCall 的知识。

最佳答案

您可以将 sys.modules 从普通的 dict 更改为 prints out assignments,例如:

import sys
import traceback

class noisydict(dict):
def __setitem__(self, key, value):
print('ASSIGNED: key={!r} value={!r} at:'.format(key, value))
traceback.print_stack()
return dict.__setitem__(self, key, value)

sys.modules = noisydict(sys.modules)

如果覆盖发生在 C 代码中,这可能会或可能不会工作(此类代码可能会直接访问底层 dict.__setitem__ 而不是仅仅执行 sys.modules[name] = newmodule 作为 Python 代码)但值得一试!

关于python - 如何调试被覆盖的 sys.modules 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27826526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com