我有一个python应用程序,它捆绑使用pyinstaller --onefile
方法。当使用多处理启动方法spwan
运行时,它会导致应用程序中间出错。
Traceback (most recent call last):
File "web.py", line 1028, in <module>
File "PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py", line 49, in _freeze_support
File "multiprocessing/spawn.py", line 105, in spawn_main
File "multiprocessing/spawn.py", line 114, in _main
File "multiprocessing/spawn.py", line 225, in prepare
File "multiprocessing/spawn.py", line 277, in _fixup_main_from_path
File "runpy.py", line 261, in run_path
File "runpy.py", line 231, in _get_code_from_file
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIRtGMqX/web.py'
[11797] Failed to execute script 'web' due to unhandled exception!
启动方法fork
看起来很好,但是有时候它会因为资源锁定问题而挂起,所以我更喜欢spawn。有人知道为什么会出现这个错误吗?
我一直在使用多处理文档中提到的freeze_support()
,尽管它对Linux没有任何影响。
if __name__ == "__main__":
freeze_support()
set_start_method('spawn')
操作系统-亚马逊Linux 2
Python语言-3.6.8
PyInstaller安装程序- 4.10
我对spwan
的理解是,每当创建一个新进程时,它都会运行一个新的Python解释器,并告诉它导入主模块然后执行。所以我的主模块是web.py
。所以当创建一个新进程时,错误就会发生。但这个问题并不一致。
3条答案
按热度按时间fnx2tebb1#
我认为这个问题的原因是程序打包后找不到web.py。
可以尝试在使用about path的位置添加以下代码。
此代码可以帮助程序在打包后找到文件。
pyinstaller的文档关于这个:https://pyinstaller.org/en/stable/runtime-information.html
r8xiu3jd2#
在这个时候,我只找到一个解决方案,就是用
forkserver
方法启动多处理。我不确定这是否会导致应用程序挂起。set_start_method('forkserver')
waxmsbnn3#
当进程由线程派生时,我遇到了类似的问题。请跟随https://github.com/pyinstaller/pyinstaller/issues/7410获取更新。