【发布时间】:2017-05-01 12:52:23
【问题描述】:
概览
我在行后导入模块时遇到问题
QtWidgets.QApplication(sys.argv),假设我得到了这个小sn-p 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 上用几个 virtualenvs 测试:
-
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32win7 Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Pyqt 是使用 pip 安装在 virtualenvs 上的,版本如下:
>>> QtCore.QT_VERSION
329472
>>> QtCore.QT_VERSION_STR
'5.7.0'
>>> QtCore.PYQT_VERSION_STR
'5.7'
相关信息
#pyqt freenode 频道的一些非常好的人帮助我测试了 repo,但他们都无法重现问题,他们使用的 python 版本和平台是:
- win10 - 3.5.2 |Anaconda 4.1.1(64 位)
- win8 - 3.5.2(v3.5.2:4def2a2901a5,2016 年 6 月 25 日,22:01:18)
- ubuntu 16.04 - 3.5.2(默认,2016 年 11 月 17 日,17:05:23)
问题
-
from PyQt5 import Qt(或其他 pyqt 模块)卡在我的盒子上而其他人无法重现的原因是什么? - 如何解决此问题?这对我来说很重要,因为我想在我的 pyqt 应用程序启动后动态加载插件
【问题讨论】:
-
一个具体建议:创建一个测试脚本,在创建
QApplication之前和之后简单地尝试执行importlib.import_module(mod_name)。如果它仍然挂起,你有你的 mcve;如果它没有挂起,您肯定会知道您还没有足够地调试您的测试用例。应该可以将list_plugins重构为独立函数。然后,您可以将它指向包含*.py文件的任何目录,看看它是否仍然挂起。这个想法是只隔离一小部分导致问题的代码并消除所有内容。 -
你能试试我在之前的 cmets 中提出的两个建议吗?它应该只需要大约十分钟的工作时间,它将允许您发布适当的 mcve。其他内容可能无关紧要 - 这几乎可以肯定是特定于您的特定设置的问题。
-
@ekhumoro 好的,我再次更新了 repo,如果您有时间,请告诉我您是否发现了可以进一步改进的其他内容,以进一步降低复杂性。
-
您能否将代码放入问题中,以便每个人都可以看到您实际测试的内容?如果您遵循我之前的建议,您应该只得到一个小文件。此外,您需要清楚地说明运行测试时会发生什么,因为您目前是唯一可以重现问题的人。
-
@ekhumoro 好的,我听从了你的建议,结果现在人们可以在这个问题中看到 repo 的内容,或者如果他们发现它是一种更快的方式来克隆 repo 内容一枪。我无法进一步简化测试用例,你可以看到结果是一组 5 个文件(不知道你为什么在我最终只得到一个小文件之前说),我仍然不确定将代码放在问题中而不是
git clone... 有什么好处...但让我们试一试,因为这个问题已经困扰我好几天了。
标签: python windows-7 python-3.5 pyqt5 python-import