我正在研究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()
导致可执行文件不断打开。但是我不知道为什么会这样,而且我也不知道如何解决。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
我遇到了同样的问题。 Scikit学习提供了一种解决方法。
我在脚本的开头添加了以下代码,并修复了我的问题:
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()
为我工作!