pyInstaller 多次加载脚本
Posted
技术标签:
【中文标题】pyInstaller 多次加载脚本【英文标题】:pyInstaller loads script multiple times 【发布时间】:2015-09-19 19:55:34 【问题描述】:我已经设法让 pyinstaller 现在或多或少地正确运行,只是它打开了太多窗口。它是 pygame 项目,它会每隔一秒左右重新加载整个内容。几秒钟后,我的电脑充满了游戏窗口,然后一切都停止了。
从命令行运行它,我可以看到打印输出说应用程序开始在命令行窗口中一遍又一遍地粘贴。据我所知,应用程序并没有关闭或退出,只是越来越多地产生。
我调用来启动 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 选项,它有时显然可以提供帮助 - 没有这样的运气。
【问题讨论】:
如果将main
重命名为main2
会怎样?
@cdonts 好主意,不幸的是没有这样的运气。没有改变。
【参考方案1】:
多处理!
我尝试了一些更简单的 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 文件运行,它仍然可以工作。
无论如何,如果您正在冻结/打包代码并且它似乎一遍又一遍地执行,请检查您是否使用了多处理。一个简单的谷歌“multiprocessing pyinstaller”给出了答案。
仅供参考,这只适用于--onedir
模式,--onefile
模式是另一回事,Windows 不支持。你必须挖掘更多才能解决这个问题。
【讨论】:
你是一个活生生的救星!这值得更高的评价!没想到我会这么快找到解决方案 - THX 我观察到 PyInstaller 监控进程在几秒钟后重复调用主脚本,但只有主进程通过freeze_support()
。为了使监控过程尽可能精简,我建议在freeze_support()
之后导入所有“重”模块,例如 matplotlib、seaborn、scipy 或您自己的邪恶创作。就我而言,这大大减少了 CPU 负载(用于监视进程)。注意:这适用于 MacOS、python 3.6、PyInstaller 3.5)【参考方案2】:
我正在使用 Pytorch 生成可执行文件。运行 .py 文件时工作正常,但是当我使用 pyinstaller 生成 exe 文件时,它是保持循环。
python -F inference_resnet101.py
这救了我:
if __name__ == '__main__':
# Pyinstaller fix
multiprocessing.freeze_support()
main()
【讨论】:
以上是关于pyInstaller 多次加载脚本的主要内容,如果未能解决你的问题,请参考以下文章
pyinstaller + pyqt5:找不到或加载“可可”
Python 编译脚本给出“无法加载插件:sqlalchemy.dialects:presto”错误
如何防止部分视图中的脚本多次加载并在同一页面中多次使用部分时导致错误