2

对于分析应用程序,我正在尝试:

  1. 使用 PyQt4 QFileDialog 从用户那里获取文件名列表
  2. 从每个文件中提取一些数据
  3. 使用 pyplot 绘制聚合数据

但是,以这种方式获取文件名会导致 pyplot.show() 花费非常非常长的时间。我已将问题提炼为以下测试用例:

import matplotlib.pyplot as plt
from PyQt4 import QtCore, QtGui

app = QtGui.QApplication(None)

fd = QtGui.QFileDialog(None)
filenames = fd.getOpenFileNames(caption='Select Data Files')

plt.plot([1,2,3,4,5])
plt.show()

请注意,我什至没有对这里的文件名做任何事情——只是获取它们。

从对话框中选择单个文件会导致 10 秒的绘图时间。有趣的是,show() 完成所需的时间与所选文件的数量大致呈线性关系。对于 10 个文件,图表显示大约需要 67 秒。

对于从少数文件中绘制数据来说,这并不是什么大问题,但是当汇总来自有数千个文件的 Monte Carlo 模拟的数据时,绘图可能需要数小时才能显示出来。告诉 matplotlib 使用 Qt4Agg 后端会导致相同的行为。

如果我注释掉对 getOpenFileNames 的调用,脚本将在一秒钟内完成。

我正在运行以下版本的相关软件包(应该是最新的):

  • 蟒蛇 2.7
  • matplotlib 1.3.1
  • python-sip 4.13.2-1
  • python-qt4 4.9.1-2ubuntu1
  • python-sip-dev 4.13.2-1
  • python-qt4-dev 4.9.1-2ubuntu1

我卸载了 sip、qt4 并重新安装了它们——同样的问题。我已经在两台不同的机器上看到了这个问题——它们都运行 32 位 Ubuntu 12.04。

任何帮助将不胜感激 - 我浪费了令人尴尬的时间等待情节显示。


更新:

  • 所选文件的类型和名称似乎无关紧要。
  • 取消或退出文件对话框不会导致延迟并立即打印。
  • 以 sudo 运行脚本可以解决这个问题;但是,当我以 sudo 运行时,文件对话框看起来不同,并且可能使用了不同的 gui 后端,这与 pyplot 对 PyQt 的使用不冲突,因此可能是一个红鲱鱼。
  • 该程序不会在 getOpenFileNames 中挂起,它会在使用 PyQt 的下一个调用中挂起。无论是绘图还是另一个文件对话框似乎都无关紧要 - 第一个文件对话框会阻止两者。
  • 运行对话框后调用 app.processEvents() 没有帮助。
  • 使用 PySide 代替 PyQt4 会导致相同的行为。
  • 使用 getOpenFileName 而不是 getOpenFileNames 会导致相同的行为。
  • 使用 DontUseNativeDialog 选项运行 getOpenFileNames 有效(无延迟)
  • 其他 QFileDialog 选项都没有任何效果(ShowDirsOnly、DontResolveSymlinks、DontConfirmOverwrite、ReadOnly、HideNameFilterDetails、DontUseSheet)
4

0 回答 0