pyinstaller打包exe程序方法及问题解决

  • pyinstaller的介绍及使用

参考https://zhuanlan.zhihu.com/p/470301078

  • 我项目中对pyinstaller的使用主要是两步:

  1. 生成spec文件

pyi-makespec -w gui.py

  1. 编辑spec文件,然后生成exe可执行文件。

pyinstaller gui.spec

  • pyinstaller中spec文件介绍

参考:Pyinstaller的Spec文件用法

https://blog.csdn.net/tangfreeze/article/details/112240342

# -*- mode: python ; coding: utf-8 -*-
 
 
block_cipher = None
 
 
a = Analysis(
    ['main.py'],#这里是项目的入口程序
    pathex=['E:\Folder\python\chaoxing-main\chaoxing-main'],    #此列表为项目路径
    binaries=[],
    datas=[( , ),( , )],          #此处填写非py文件,多个文件用(),[('源文件路径','目标路径')]
    hiddenimports=[],#这里写其他依赖的项目,比如
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
 
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='main',       #程序exe的名称
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,        # 打包的时候进行压缩,False表示不压缩
    console=True,    #此处console=True表示,打包后的可执行文件双击运行时屏幕会出现一个cmd窗口,不影响原程序运行,如不需要执行窗口,改成False即可
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='icon.ico',      #程序图标,要绝对路径
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='main',       #程序文件夹名称
)

  • 遇到的问题及解决

  1. Python进程池pool与pyinstaller打包exe程序运行进入死循环。

  1. 描述

我在主程序调用的子程序中使用了多进程,然后在idea中运行没问题,但是打包成exe后,运行就会不停的重新打开gui页面。

  1. 原因

(1)、因为开启子进程是不支持打包exe文件的,所以会不停向操作系统申请创建子进程,

而这个代码 multiprocessing.freeze_support() 作用就是支持打包到Windows的EXE文件。

(2)、多进程的程序运行后,如果直接关闭控制台窗口,那么整个程序都会退出。

如果是 进入 任务管理器,单独结束 控制窗口 的进程,如果子进程不是守护进程,那么子进程还是会继续运行。

(3)、如果是多线程的,则没这个问题,可以直接打包。

  1. 解决

在if __name__ == '__main__': 中加入:multiprocessing.freeze_support()

  1. 其它

但有个小提示, 如果是 tkinter 的图形界面运行的,是多线程的话,如果子线程不是守护线程,那么关掉主界面后,子线程会继续运行。

如果也是控制台窗口的话,效果和上面 2 提到的进程效果一样。

参考:https://blog.csdn.net/maskxxx/article/details/109292698

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值