pyinstaller可执行文件不断打开

时间:2019-02-13 04:01:32

标签: python pyinstaller

背景

我正在研究this link之后的人脸识别,我想使用Python构建一个独立的应用程序。我的main.py脚本如下所示。

# main.py

# Import packages and other scripts
import tkinter as tk
...

# Some functions
def initialization():
    # OpenCV and sklearn are used here
    ...

def registration():
    # OpenCV, and sklearn are used here
    ...

def face_recognition():
    # OpenCV and sklearn are used here
    ...

# Start the Tkinter GUI
window = tk.Tk()

# Initialize the face recognition model
initialization()

# Input name for registration
tk.Label(window, text = "Name").grid(...)
entry1 = tk.Entry(window)
entry1.grid(row=0, column=1)

# When the button is clicked, different command is executed
tk.Button(window, text='Registration', command=registeration).grid(...) 
tk.Button(window, text='Face Recognition', command=face_recognition).grid(...)

window.mainloop()

使用python解释程序运行脚本(python main.py),一切正常。


问题

我使用 Pyinstaller 通过以下命令将脚本转换为单个exe:

pyinstaller --onefile \
            --windowed \
            --hidden-import sklearn.neighbors.typedefs \
            main.py

然后,我生成了两个exe。第一个在dist/main中,第二个在dist/main.app/Contents/MacOS/main

运行exe时,exe自身会保持重复。我显示正在运行的过程并找到了结果

$ ps
PID    TTY    TIME    CMD
...    ...    ...     /path/to/main -B -s -S -E -c from multiprocessing.semaphore_tracker import main:main(8)
...    ...    ...     /path/to/main -B -s -S -E -c from multiprocessing.semaphore_tracker import main:main(8)
...    ...    ...     /path/to/main -B -s -S -E -c from multiprocessing.semaphore_tracker import main:main(7)
...    ...    ...     /path/to/main -B -s -S -E -c from multiprocessing.semaphore_tracker import main:main(7)
...    ...    ...     /path/to/main -B -s -S -E -c from multiprocessing.semaphore_tracker import main:main(8)

我不知道exe会发生什么变化,因为我没有在脚本中导入多处理程序包。任何想法如何解决此问题?谢谢


更新1

我在使用--log-level ERROR时添加了Pyinstaller并给出了结果。不确定是否与我的问题有关。

Traceback (most recent call last):
  File "<string>", line 2, in <module>
ModuleNotFoundError: No module named 'Crypto.Math'
174598 INFO: MKL libraries found when importing numpy. Adding MKL to binaries
176282 ERROR: Can not find path ./libtbb.dylib (needed by /Users/user/anaconda3/lib/libmkl_tbb_thread.dylib)

更新2

我发现我正在使用的一个软件包-imultis VideoStream涉及threading。我想这是观察from multiprocessing.semaphore_tracker的原因,尽管我没有明确import multiprocessing

然后我遇到this post,建议添加multiprocessing.freeze_support()。它可以禁止GUI窗口继续复制,但是使用$ ps所示的后台进程仍然保持复制。该问题尚未解决。


更新3(已找到问题,但未解决)

在调试代码一段时间后,结果发现无限循环的原因并非归因于threading VideoStream的imultis(我编写了另一个脚本来测试{{1} },这是完全可以的)。但是问题出在导入imultis上!!!该问题已在GitHub this link中报告。

此GitHub链接还建议包含sklearn。此外,其中一个响应建议在调用multiprocessing.freeze_support()之后导入sklearn。我用一个简单的脚本尝试了,但问题仍然存在。

结论multiprocessing.freeze_support()导致可执行文件不断打开。但是我不知道为什么会这样,而且我也不知道如何解决。任何帮助,将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。 Scikit学习提供了一种解决方法。

https://scikit-learn.org/stable/faq.html#why-do-i-sometime-get-a-crash-freeze-with-n-jobs-1-under-osx-or-linux

我在脚本的开头添加了以下代码,并修复了我的问题:

import multiprocessing
multiprocessing.set_start_method('forkserver', force=True)
multiprocessing.freeze_support()

希望这也可以解决您的问题。

答案 1 :(得分:0)

此修复程序不适用于macOS-如果您使用PyInstaller冻结了一个调用sklearn的应用程序,则该问题仍然存在。 我正在macOS Mojave 10.14.3上运行带有PyInstaller 3.4和PyQT5 5.12的Python 3.7.2。

答案 2 :(得分:0)

此答案很好地解释了为什么发生这种情况:https://stackoverflow.com/a/55382641/109525

在启动程序之前,请先尝试设置此项:

export JOBLIB_MULTIPROCESSING=0

如果可行,可以将运行时挂钩添加到程序中以自动设置环境变量。参见:https://pythonhosted.org/PyInstaller/when-things-go-wrong.html#changing-runtime-behavior

答案 3 :(得分:0)

从以下内容开始我的主要入口点:

from multiprocessing import freeze_support
freeze_support()

为我工作!