概述
在QtWidgets.QApplication(sys.argv)
这一行之后,我遇到了导入模块的问题,假设我有这个小片段main.py
:
import sys
import importlib
from PyQt5 import QtWidgets
print('Sys Path:')
print(' %s\n' % '\n '.join(sys.path))
if sys.argv[-1] == '1':
print('Importing Before...\n')
from PyQt5 import Qt
app = QtWidgets.QApplication(sys.argv)
elif sys.argv[-1] == '2':
print('Importing After...\n')
app = QtWidgets.QApplication(sys.argv)
from PyQt5 import Qt
print('Done')
- 如果我运行
python main.py 1
,一切都按预期工作。 - 如果我运行
python main.py 2
,进程会挂起(可能是在一个无限循环中),但不会显示任何错误信息。
python main.py 2
的输出:
(py352) D:\sources\personal\python\pyqt\mcve>python main.py 2
Sys Path:
D:\sources\personal\python\pyqt\mcve
D:\sources\personal\python
d:\virtual_envs\py352\Scripts\python35.zip
d:\virtual_envs\py352\DLLs
d:\virtual_envs\py352\lib
d:\virtual_envs\py352\Scripts
c:\Python352\Lib
c:\Python352\DLLs
d:\virtual_envs\py352
d:\virtual_envs\py352\lib\site-packages
Importing After...
(HANG)
尝试
在win7上使用了几个虚拟环境进行测试:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
在win7
上运行Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Pyqt 是通过 pip 在虚拟环境中安装的,版本如下:
>>> QtCore.QT_VERSION
329472
>>> QtCore.QT_VERSION_STR
'5.7.0'
>>> QtCore.PYQT_VERSION_STR
'5.7'
相关信息
来自#pyqt freenode
频道的一些非常友好的人帮我测试了这个仓库,他们都无法复现该问题,他们使用的Python版本和平台如下:
- win10 - 3.5.2 |Anaconda 4.1.1 (64位)
- win8 - 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18)
- ubuntu 16.04 - 3.5.2 (默认值,Nov 17 2016, 17:05:23)
问题
- 为什么在我的电脑上
from PyQt5 import Qt
(或其他pyqt模块)会卡住,而其他人无法复现? - 我该如何解决这种行为?这对我很重要,因为我想在我的PyQt应用程序启动后动态加载插件。
QApplication
之前和之后执行importlib.import_module(mod_name)
。如果它仍然挂起,那么你就有了你的mcve;如果它没有挂起,你就会确切地知道你还没有足够调试你的测试用例。应该可以将list_plugins
重构为一个独立的函数。然后,您只需将其指向包含*.py
文件的任何目录,看看它是否仍然挂起。这个想法是隔离只引起问题的一小部分代码并消除所有其他东西。 - ekhumorogit clone
...但让我们试一试,因为这个问题已经困扰我几天了。 - BPL