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

Pyqt4-pyqtgraph application recursively opens new instances of itself

我为我的项目 fork BMDanalyse 并修改了它。

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

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

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

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

安装软件包

打开 BMDanalyse project you should then be able to run SPCanalyse.py to get the app going. It has bugs and is a very early prototype. Download the following example data 以确保它按预期工作。

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

  1. 单击文件,加载图像,加载两个图像。单击 'Alignment'。在应用程序完成其工作后,一个名为 aligned.raw 的文件应该出现在您的下载文件夹
  2. 加载 alignment.raw 图片。 'alignment.raw' 将出现在右侧的列表中。点击 alignment.raw。单击 ROI、添加 ROI -> 多边形。绘制两个多边形如下图所示: 获得投资回报率后,单击分析 -> 投资回报率分析。 ROI.raw 应该出现在您的下载文件夹中。
  3. 加载ROI.raw.点击它。单击时间过滤器。一段时间后 dfoverf0_avg_framesIncl.raw 应该会出现在您的下载文件夹中
  4. 加载dfoverf0_avg_framesIncl.raw.点击它。屏幕应该变黑。如果 ROI 仍然存在,请将其移除。现在点击黑色场景中的随机位置。你看到的是seed pixel correlation maps

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


实际问题

但是,现在它可以正常工作了,我需要这个应用程序的独立 .exe 文件,它可以在没有任何依赖项的情况下工作,只是为了向我的主管展示它可以完成。

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

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

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

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

请注意第 2-3 步按预期工作!单击黑色场景时,第 4 步会产生相同的递归自开循环。

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

Of course, if you happen to have open channels, or files, or other connections that should only be used by the parent process, your program may behave in a very wierd way: as an example, do not open a graphic window before calling a Parmap primitive, and do not use this library if your program is multi-threaded!

因此我很确定我对 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

当我转到 "built" 所在的位置时,我发现我的程序缺少 folder with scripts absolutely essential。也许这暗示了是什么导致了我的错误?查看 运行ning build 完成的图像(即没有 SPCExplorer 文件夹):

我不知道这个或 setup.py 是否必然与为什么 运行 宁 .exe 给我错误

所以问题确实是由多处理引起的。然而,如果你 google 'multiprocessing pyinstaller' 你可以找到 this

事实证明

只需在 if __name__=='__main__': 后添加 multiprocessing.freeze_support() 在你的主文件中(在我的例子中是SPCanalyse.py)并在文件的开头添加import multiprocessing

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