当作为可执行文件冻结时,多处理运行主窗口的新实例

dpi*_*h40 5 python pyinstaller multiprocessing

一年前我已经问过这个问题.我的应用程序使用Python的多处理模块,从命令行运行时工作正常,但是当我使用Pyinstaller将其打包为可执行文件时,多个进程会生成为原始的新实例,而不是运行它们应该运行的函数.上次给我的建议以及我看到的其他地方的建议是multiprocessing.freeze_support(在我的if __name__ == "__main__":块开始时打电话,我一直这样做,但是由于某种原因我突然再次遇到这个问题.还有什么可能导致这个?

更新:我已确认freeze_support()行的存在根本不会影响此问题.对它进行注释或取消注释它会产生完全相同的行为:主窗口的副本被打开并坐在那里什么都不做.这是在我的主要Python模块的最末端调用它的块:

if __name__ == '__main__':
    freeze_support()

    # (A bunch of commented-out lines)
    main()
Run Code Online (Sandbox Code Playgroud)

dpi*_*h40 5

我是一个白痴.(好吧,也许不是,但这完全是我的错)多处理通过运行它带有两个额外的参数来表示它是子进程的进程:标志--multiprocessing-fork和来自父进程的管道的数字句柄.multiprocessing.freeze_support检查是否存在此标志,以决定是否运行为子进程或普通程序指定的函数.无论如何,我解析命令行参数的方法改变了sys.argv,它摆脱了标志并导致子进程像新的父进程一样运行.

所以,故事的寓意是,永远不要改变sys.argv.我切换到使用optparse,它抱怨标志的存在,所以我不得不传递一个过滤的参数列表.一旦我这样做,问题就消失了.

  • 嗨,我仍然有这个问题,但我什至从未接触过脚本中的sys.argv。您是否可以转发任何参考,以便我研究其原因? (2认同)