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 应用程序递归打开自身的新实例的主要内容,如果未能解决你的问题,请参考以下文章