python-3.x PyInstaller捆绑包导致FileNotFoundError与多处理派生方法

lyfkaqu1  于 2023-02-06  发布在  Python
关注(0)|答案(3)|浏览(202)

我有一个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。所以当创建一个新进程时,错误就会发生。但这个问题并不一致。

fnx2tebb

fnx2tebb1#

我认为这个问题的原因是程序打包后找不到web.py。
可以尝试在使用about path的位置添加以下代码。

if getattr(sys, 'frozen', False):
    bundle_dir = sys._MEIPASS
else:
    bundle_dir = os.path.dirname(os.path.abspath(__file__))

此代码可以帮助程序在打包后找到文件。
pyinstaller的文档关于这个:https://pyinstaller.org/en/stable/runtime-information.html

r8xiu3jd

r8xiu3jd2#

在这个时候,我只找到一个解决方案,就是用forkserver方法启动多处理。我不确定这是否会导致应用程序挂起。
set_start_method('forkserver')

waxmsbnn

waxmsbnn3#

当进程由线程派生时,我遇到了类似的问题。请跟随https://github.com/pyinstaller/pyinstaller/issues/7410获取更新。

相关问题