Pyqt4-pyqtgraph 应用程序递归打开自身的新实例

Posted

技术标签:

【中文标题】Pyqt4-pyqtgraph 应用程序递归打开自身的新实例【英文标题】:Pyqt4-pyqtgraph application recursively opens new instances of itself 【发布时间】:2016-07-21 17:50:04 【问题描述】:

我为我的项目 fork BMDanalyse 并对其进行了修改。

设置说明,以备不时之需。实际问题如下。

由于内存要求,需要 64 位系统。请确保您拥有64bit Python 2.7。

以下设置说明适用于 Windows 或 Ubuntu 上的 Pycharm,尽管您希望它在 Windows 上运行,因为我的问题是关于制作 .exe:

需要以下软件包。不要忘记选择 64 位的。在提供链接的情况下,您将无法简单地通过 Pycharm 安装软件包。

numpy pyqtgraph matplotlib PyQt4 pillow scipy 参数映射

打开BMDanalyse project 后,您应该能够运行SPCanalyse.py 以启动应用程序。它有错误并且是一个非常早期的原型。下载以下example data 以确保它按预期工作。

如果您按顺序执行以下操作,则应该可以。您当然可以检查您的 IDE 控制台,了解应用正在做什么(尚未添加进度条)

    单击文件,加载图像,加载两个图像。单击“对齐”。应用完成后,一个名为 aligned.raw 的文件应该会出现在您的“下载”文件夹中 加载alignment.raw 图像。 'alignment.raw' 将出现在右侧的列表中。点击alignment.raw。单击 ROIs,添加 ROIs -> 多边形。绘制两个多边形,如下图: 获得 ROI 后,单击分析 -> ROI 分析。 ROI.raw 应该出现在您的下载文件夹中。 加载ROI.raw. 点击它。单击时间过滤器。一段时间后,dfoverf0_avg_framesIncl.raw 应该会出现在您的下载文件夹中 加载dfoverf0_avg_framesIncl.raw. 点击它。屏幕应该变黑。如果它们仍然存在,请删除 ROI。现在单击黑色场景上的随机位置。你看到的是seed pixel correlation maps

如果所有这 4 个步骤都有效,则应用在您的系统上按预期运行。


实际问题

但是,既然它正在运行,我需要这个应用程序的独立 .exe,它可以在没有任何依赖关系的情况下运行,只是为了向我的主管展示它可以完成。

如果我在项目的主脚本上使用python SPCanalyse.py,它会运行并且我的应用程序会弹出。

更新:我的笔记本电脑被盗了。然而,在一个干净的系统上设置所有东西时,我遇到了不同的问题。我能想到的唯一不同之处在于我没有依赖来自 Continuum analytics 的 Anaconda 进行包管理。

如果我在主脚本上使用pyinstaller SPCanalyse.py,我会得到一个 .exe,如果我首先运行该 .exe,我会发现我的图标不见了。其次,会发生这种情况:

当我按下对齐按钮(即完成设置中的第 1 步)时,应用程序会冻结(即没有响应),然后反复打开自身的新实例。我假设这是与内存相关的,因为此操作确实需要大量内存。如果我查看应用程序占用了多少内存(仅查看原始的“无响应”实例),我会发现它每次都恰好处于 1,180.8MB 的稳定状态。考虑到所有其他正在运行的进程,尽管我仍然只使用了 32GB 内存的 28%。我尝试将应用程序的优先级设置为高无效。我还尝试通过命令提示符打开以查看是否收到任何有用的错误消息。可惜没有。

请注意,步骤 2-3 可以按预期工作!在单击黑色场景时,第 4 步会导致相同的递归打开自身循环。

我想我找到了这里发生的事情的解释: https://github.com/rdicosmo/parmap

当然,如果您碰巧有打开的频道、文件或其他 仅应由父进程使用的连接,您的 程序可能会以一种非常奇怪的方式运行:例如,不要打开 调用 Parmap 原语之前的图形窗口,不要使用它 如果您的程序是多线程的,则库!

因此,我很确定我使用 parmap 非常非常不正确。如果我通过我的 IDE 运行我,我仍然很困惑为什么我的应用程序可以工作!

旧的未解决的问题,现在是我的小偷的问题

如果我在我的主脚本上使用pyinstaller SPCanalyse.py,当我尝试运行生成的 .exe 时会输出以下输出

D:\Home\Downloads\BMDanalyse\BMDanalyse>D:\Home\Downloads\BMDanalyse\BMDanalyse\
dist\SPCanalyse\SPCanalyse.exe
Traceback (most recent call last):
  File "<string>", line 21, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "BMDanalyse\SPCExplorer\filter_jeff.py", line 9, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\image_registration\__init__.py", line 1, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\image_registration\cross_correlation_shifts.py", line 4, i
n <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\image_registration\fft_tools\__init__.py", line 3, in <mod
ule>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\image_registration\fft_tools\correlate2d.py", line 2, in <
module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\image_registration\fft_tools\convolve_nd.py", line 329, in
 <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\pytest.py", line 21, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\_pytest\config.py", line 11, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\_pytest\_code\__init__.py", line 2, in <module>
  File "c:\users\cornelis\appdata\local\temp\pip-build-6xhsyv\pyinstaller\PyInst
aller\loader\pyimod03_importers.py", line 389, in load_module
  File "site-packages\_pytest\_code\code.py", line 8, in <module>
  File "site-packages\py\_apipkg.py", line 125, in __makeattr
  File "site-packages\py\_apipkg.py", line 48, in importobj
ImportError: No module named _builtin
SPCanalyse returned -1

起初我认为我的问题与 No module named builtins 有关,因此我更新了 setup.py 以包含我可以发现我的项目远程依赖的所有可能的包:

install_requires = [
    'pyinstaller'
    'future'
    'astropy',
    'image_registration',
    'scipy',
    'FITS_tools',
    'pywcs',
    'pyfits',
    'pytest',
    'parmap',
    'setuptools',
    'pyqtgraph',        
    'matplotlib',
    'numpy',
    'PIL',
    'SPCExplorer',
    ],

我也试过python setup.py build,我得到了:

D:\Home\Downloads\BMDanalyse>python setup.py build
running build
running build_py
creating build
creating build\lib
creating build\lib\BMDanalyse
copying BMDanalyse\customItems.py -> build\lib\BMDanalyse
copying BMDanalyse\matplotlib_fix.py -> build\lib\BMDanalyse
copying BMDanalyse\ordereddict.py -> build\lib\BMDanalyse
copying BMDanalyse\ROI.py -> build\lib\BMDanalyse
copying BMDanalyse\SidePanel.py -> build\lib\BMDanalyse
copying BMDanalyse\SPCanalyse.py -> build\lib\BMDanalyse
copying BMDanalyse\version.py -> build\lib\BMDanalyse
copying BMDanalyse\ViewBoxCustom.py -> build\lib\BMDanalyse
copying BMDanalyse\__init__.py -> build\lib\BMDanalyse
creating build\lib\BMDanalyse\icons
copying BMDanalyse\icons\arrow-down-2.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\arrow-left.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\arrow-right.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\arrow-up-2.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\filesave.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\file_add.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\file_copy.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\file_delete2.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\green-add3.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\logo.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\opened-folder.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\polygonIcon.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\README.txt -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\rectangularIcon.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\icons\red_delete.png -> build\lib\BMDanalyse\icons
copying BMDanalyse\changeLog.txt -> build\lib\BMDanalyse
creating build\lib\BMDanalyse\sampleMedicalImages
creating build\lib\BMDanalyse\sampleMedicalImages\Implant
creating build\lib\BMDanalyse\sampleMedicalImages\Implant\XYplane
copying BMDanalyse\sampleMedicalImages\Implant\XYplane\vxray_XY_1.png -> build\l
ib\BMDanalyse\sampleMedicalImages\Implant\XYplane
copying BMDanalyse\sampleMedicalImages\Implant\XYplane\vxray_XY_11.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\XYplane
copying BMDanalyse\sampleMedicalImages\Implant\XYplane\vxray_XY_21.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\XYplane
copying BMDanalyse\sampleMedicalImages\Implant\XYplane\vxray_XY_31.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\XYplane
copying BMDanalyse\sampleMedicalImages\Implant\XYplane\vxray_XY_6.png -> build\l
ib\BMDanalyse\sampleMedicalImages\Implant\XYplane
creating build\lib\BMDanalyse\sampleMedicalImages\Implant\YZplane
copying BMDanalyse\sampleMedicalImages\Implant\YZplane\vxray_YZ_1.png -> build\l
ib\BMDanalyse\sampleMedicalImages\Implant\YZplane
copying BMDanalyse\sampleMedicalImages\Implant\YZplane\vxray_YZ_11.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\YZplane
copying BMDanalyse\sampleMedicalImages\Implant\YZplane\vxray_YZ_21.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\YZplane
copying BMDanalyse\sampleMedicalImages\Implant\YZplane\vxray_YZ_31.png -> build\
lib\BMDanalyse\sampleMedicalImages\Implant\YZplane
copying BMDanalyse\sampleMedicalImages\Implant\YZplane\vxray_YZ_6.png -> build\l
ib\BMDanalyse\sampleMedicalImages\Implant\YZplane
creating build\lib\BMDanalyse\sampleMedicalImages\No implant
creating build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
copying BMDanalyse\sampleMedicalImages\No implant\XYplane\noimplant_XY_1.png ->
build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
copying BMDanalyse\sampleMedicalImages\No implant\XYplane\noimplant_XY_11.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
copying BMDanalyse\sampleMedicalImages\No implant\XYplane\noimplant_XY_21.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
copying BMDanalyse\sampleMedicalImages\No implant\XYplane\noimplant_XY_31.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
copying BMDanalyse\sampleMedicalImages\No implant\XYplane\noimplant_XY_6.png ->
build\lib\BMDanalyse\sampleMedicalImages\No implant\XYplane
creating build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane
copying BMDanalyse\sampleMedicalImages\No implant\YZplane\noimplant_YZ_1.png ->
build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane
copying BMDanalyse\sampleMedicalImages\No implant\YZplane\noimplant_YZ_11.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane
copying BMDanalyse\sampleMedicalImages\No implant\YZplane\noimplant_YZ_21.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane
copying BMDanalyse\sampleMedicalImages\No implant\YZplane\noimplant_YZ_31.png ->
 build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane
copying BMDanalyse\sampleMedicalImages\No implant\YZplane\noimplant_YZ_6.png ->
build\lib\BMDanalyse\sampleMedicalImages\No implant\YZplane

当我转到所有这些“构建”的地方时,我发现我的程序缺少 folder with scripts absolutely essential。也许这暗示了导致我的错误的原因?查看运行 build 完成的图像(即没有 SPCExplorer 文件夹):

我不知道这个或setup.py 是否一定与为什么运行 .exe 会出现错误有关

【问题讨论】:

尝试将 SPCExplorer 添加到安装需求列表中? 鉴于您对此有赏金,请让我们知道@busfault 的建议是否有效。我建议他已经正确识别了问题(SPCExplorer 是您制作的模块,您需要将其包含在列表中)。如果这不能解决问题,请在此处的评论中告诉我们! 我正在努力。自从我的笔记本电脑被盗后,我刚刚打了个嗝。 您好。首先:将其添加到 setup.py 没有任何区别。但是,请看问题。我的笔记本电脑被盗似乎有一线希望。我为打嗝道歉,只能希望我的小偷得到什么来找他。在赏金结束之前,我已经尽了最大努力,但很遗憾我做不到。 看来我的问题很可能在 parmap 包中。请查看我更新的问题 【参考方案1】:

所以问题确实是由于多处理造成的。但是,如果你用谷歌搜索“多处理 pyinstaller”,你可以找到 this

事实证明

只需在if __name__=='__main__': 之后添加multiprocessing.freeze_support() 在您的主文件中(在我的情况下为SPCanalyse.py)并在文件开头添加import multiprocessing

我的程序现在作为独立的 .exe 运行并满足列出的所有四个要求

【讨论】:

以上是关于Pyqt4-pyqtgraph 应用程序递归打开自身的新实例的主要内容,如果未能解决你的问题,请参考以下文章

Python_自定义递归的最大深度

递归题正确的打开方式,面试官听了都说精辟

递归和迭代

如何实现递归自连接实体框架?

递归自加入 Redshift?

Python:打印自定义异常时超出最大递归深度