【问题标题】:Dynamically creating module in sys.modules causes sys to become None在 sys.modules 中动态创建模块会导致 sys 变为 None
【发布时间】:2016-05-28 12:18:22
【问题描述】:

我正在创建一个名为 Qt (Github link) 的模块,其中我为另一个模块(例如 PyQt4)设置别名,因此当我导入 Qt 时,我实际上是在导入 PyQt4

from Qt import QtWidgets  # this really imports PyQt4.QtGui

示例Qt 模块:

# Qt.py
import sys
import PyQt4.Qt

sys.modules["Qt"] = PyQt4
PyQt4.QtWidgets = PyQt4.QtGui

但是,如果我在 Qt.py 的末尾添加 print syssys 等于 None

print sys
>>> None

为什么sys 会“破坏”,我可以避免破坏它吗?

这是在 OS X 上的 Python 2.7.11 中。


@Lol4t0 – 这是我仅使用标准模块的示例:

# Xyz.py

import os
import sys

sys.modules['Xyz'] = os
print sys  # this will print "None"

所以导入它会导致“没有打印:

$ python
Python 2.7.11 (default, Jan 22 2016, 08:29:18)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Xyz
None

【问题讨论】:

  • 这种行为是否仅适用于 PyQt 模块?
  • @Lol4t0 不,这也发生在例如PySide.
  • 那你能举个例子,只使用标准模块,显示问题,这样每个人都可以在他们的机器上运行它并能够调查吗?
  • @Lol4t0 好的,添加了一个示例“Xyz.py”。
  • 谢谢。我明白了,你可以重新导入 sys

标签: python


【解决方案1】:

当不再有任何对模块的引用时,它将通过将其替换为 None 来删除其所有全局变量。

您需要记住sys.modules['Xyz'] 版本(即当前模块),直到您完成执行它。

【讨论】:

  • 啊哈,我现在明白了。这不仅发生在 sys... 上,而且实际上发生在 python 文件中的 any 导入模块上。通过将文件名更改为与我注册的模块不匹配,不会发生此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2011-02-25
  • 2010-12-29
相关资源
最近更新 更多