pyInstaller 多次加载脚本

pyInstaller loads script multiple times

我现在已经或多或少正确地将 pyinstaller 安装到 运行,除了它打开太多 windows。这是一个 pygame 项目,它每隔一秒左右就会重新加载整个项目。几秒钟后,我的电脑充满了游戏 windows,然后一切都停止了。

运行 它来自命令行,我只能看到打印输出说该应用程序开始在命令行中一遍又一遍地粘贴 window。据我所知,应用程序并没有关闭或退出,只是越来越多。

我调用的启动pyinstaller的命令是这样的:

pyinstaller --onedir main_local.py

主文件如下所示:

# Library imports
import pygame

# Project imports
from multiroidal_client    import MultiroidalClient
from settings              import *
import time

# Main program function
def main():

    # Initialise game class
    game = MultiroidalClient(SCREEN_SIZE, ('127.0.0.1', 8080))

    # Start game loop
    game.main_game_loop()


# Execute main function
if __name__ == '__main__':
    main()

我试着注释掉 if __ name __ ... 位,看看它是否出于某种原因正在执行 main 函数,并且每次都意外地调用了一个副本。当注释掉时,exec 什么都不做,正如您所期望的那样。

有什么想法吗?我没有包含更多代码,因为它有很多,而且我不确定哪些部分是相关的。如果您需要查看其他内容,请告诉我。

干杯

编辑:我在 game.main_game_loop() 之后添加了一个快速打印,只是为了检查脚本是否跳出了无限游戏循环。没有这样的运气。它正在加载脚本的并行实例,全部 运行 同时加载。

编辑:我查看了 pyinstaller 文档并设法进行了更多调试。不确定它是否相关,但它在这里。这个对话屏幕只是一遍又一遍地重印。我还尝试了 --noupx 选项,它有时显然可以提供帮助 - 没有这样的运气。

多处理!

我尝试了一些更简单的 python 程序,它们都很好地打包了。所以这不是我的方法的问题,而是代码的问题。又想了想,项目中一定有一些不寻常或者难以打包的代码。嗯,也许线程?

我有几个并行线程 运行,它们是多处理线程。谷歌搜索后我发现了这个 magic fix

您只需在 if __name__ == "__main__" 之后和调用 main() 函数之前粘贴此行 multiprocessing.freeze_support()

if __name__ == '__main__':

    # Pyinstaller fix
    multiprocessing.freeze_support()

    main()

看起来开发多处理模块的人必须包含一个 hack 以允许冻结打包(py2exe、pyinstaller 等)。似乎很奇怪,它没有更顺利地包含在内。如果您保留 freeze_support() 调用,即使您不是 运行 来自打包代码而不是标准 python 文件,它仍然有效。

无论如何,如果您正在 freezing/pacakaging 编写代码并且它似乎一遍又一遍地自行执行,请检查您是否正在使用多处理。一个简单的google"multiprocessing pyinstaller"就给出了答案

仅供参考,这仅适用于 --onedir 模式,--onefile 模式是另一回事,在 windows 上不受支持。你必须深入挖掘才能解决这个问题。

我正在使用 Pytorch 生成可执行文件。 运行 .py 文件时工作正常,但是当我使用 pyinstaller 生成 exe 文件时,它一直在循环。

python -F inference_resnet101.py

这救了我:

if __name__ == '__main__':

# Pyinstaller fix
multiprocessing.freeze_support()

main()