百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

pyinstaller打包python程序高级技巧

off999 2024-09-16 00:53 69 浏览 0 评论

pyinstaller是最常用的python程序打包成可执行程序(exe)的工具,这篇文章将介绍几个pyinstaller打包可能遇到的问题及其解决方法。

安装

pyinstaller的安装很简单,直接pip安装就可以。

pip install pyinstaller

打包指令

-F

生成一个exe程序,所有依赖项被打包进该exe程序中

-D

生成一个包含exe程序的目录,所有依赖项和exe程序位于同一目录下

-i

为生成的exe程序指定一个icon图标

-n

指定生成的.exe和.spec文件名

-c

显示命令行窗口

-w

不显示命令行窗口

–distpath

指定打包后的程序存放目录,默认为当前目录下的dist目录

–workpath

为输出的所有临时文件指定存放目录

-h

帮助信息

例如,打包成一个exe文件:

pyinstaller -F  test.py

打包成一个exe,实际运行目录

将程序打包成一个exe文件后,每次运行时,pyinstaller会先将exe解压到一个临时目录,然后运行主文件,这个目录所在位置在c:/users/xxxx/AppData/Local/Temp目录下,一般为_MEI开头的文件夹。

需要注意的是:

  1. 每次运行都需要这个解压过程,所以如果exe文件太大,解压需要消耗很长时间,所以大文件不建议打包成一个exe。
  2. 临时文件夹可能不会自动删除,会导致临时文件越积越多,占用磁盘空间。

多进程程序打包无法运行

如果使用到了多进程程序,打包后可能出现循环调用,无法运行程序。这时需要加入一下代码解决,并且最好写在第一行。

from multiprocessing import freeze_support
freeze_support()

打包文件太大,如何瘦身

pyinstaller需要将python环境一起打包进去,所以本身打包后的文件就会比较大,但是一些没有用到的模块很可能也被打包进去了,应该想办法将这些模块排除掉。

我们可以先选择不打包为一个exe文件(即不使用-F),然后到dist文件目录下的打包成功目录看看哪个文件或文件夹(模块)最大,分析这个文件或模块是否是必须使用的依赖,甚至可以一个一个排除测试exe是否可以正常执行。

这个时候需要手动编辑spec文件中的excludes,例如:

a = Analysis(['test.py'],
             pathex=['E:\\python-workspace\\test'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=['matplotlib','PIL','cython','PyQt4','zmq'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

找不到模块

打包过程中报错,找不到某个模块。

ModuleNotFoundError: No module named uvicorn

这时首先可以尝试在hiddenimports中引入这个模块再次打包。

a = Analysis(['test.py'],
             pathex=['E:\\python-workspace\\test'],
             binaries=[],
             datas=[],
             hiddenimports=[
                'fastapi',
                'uvicorn.logging'],
             hookspath=[],
             runtime_hooks=[],
             excludes=['matplotlib','PIL','cython','PyQt4','zmq'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

无法引入某些模块的dll

例如使用扫码组件pyzbar,打包执行时提示找不到dll,这时,可以在spec文件中的binaries手动引入。实际代码如下:

import pyzbar
import pathlib

pyzbar_dir = pathlib.Path(pyzbar.__file__).parent
pyzbar_dlls = [(str(dll), '.') for dll in pyzbar_dir.glob('*.dll')]

dlls = pyzbar_dlls
a = Analysis(['test.py'],
             pathex=['E:\\python-workspace\\test'],
             binaries=dlls,
             ...
        )

其他资源文件打包

如果需要打包配置文件或者图片资源,可以在spec文件中的datas手动引入。例如打包config文件夹下所有内容:

a = Analysis(['test.py'],
             pathex=['E:\\python-workspace\\test'],
             binaries=[],
             datas=[('config\\','config')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

打包后的可执行文件无法在别人电脑运行

程序在自己电脑运行正常,但是在别人电脑上直接弹出错误,而且没有具体报错。这很可能是缺少了一些必要的系统dll。因为很多python模块还需要vcruntime等dll,如果自己的开发电脑已经安装vc运行环境而别人的电脑没有安装,程序就无法运行。

我们可以使用https://github.com/lucasg/Dependencies这个开源项目提供的工具来查看exe文件依赖的dll,然后看我们打包程序中是否缺少某些必要依赖,如果缺少dll,则可以通过上述的binaries或datas中手动引入的方式打包dll。

例如缺少vcruntime140相关dll:

a = Analysis(['test.py'],
             pathex=['E:\\python-workspace\\test'],
             binaries=[],
             datas=[('C:\\Windows\\System32\\vcomp140.dll','.'),('C:\\Windows\\System32\\vcruntime140_1.dll','.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

相关推荐

路由器初始密码忘了怎么办(路由器忘记原始密码怎么办)

路由器密码忘了可以通过恢复出厂设置重新设置密码1、把所有网线都从路由器上拔掉,只保留电源线既可;    2、然后用稍尖的笔尖刺紧路由器背面的“RESET”小孔不放;    3、有的是“RESET”...

hotmail邮箱还能用吗(hotmail邮箱登录有手机客户端的吗)

这个是可以重新申请的呢除了谷歌国内受限,其他基本都可以正常使用。看个人使用习惯可自主申请相应邮箱:微软outlook、hotmail邮箱;网易邮箱、网易126邮箱;新浪邮箱、阿里邮箱;QQ邮箱、搜狐...

怎么建立局域网(怎么建立局域网内其他电脑文件夹的快捷方式)
  • 怎么建立局域网(怎么建立局域网内其他电脑文件夹的快捷方式)
  • 怎么建立局域网(怎么建立局域网内其他电脑文件夹的快捷方式)
  • 怎么建立局域网(怎么建立局域网内其他电脑文件夹的快捷方式)
  • 怎么建立局域网(怎么建立局域网内其他电脑文件夹的快捷方式)
diskdigger官网入口(diskinfo官网)

打开LaunchCenterPro,创建一个叫Omnifocus的操作组,然后再往这个操作组添加新的操作。如果你要在Omnifocus创建新收件箱项,添加URL到LaunchCenter...

最新英特尔处理器排名(最新英特尔处理器排名第几)

一、英特尔酷睿i7670。这款英特尔CPU采用的是超频新芯,最大程度的提升处理器的超频能力。二、英特尔酷睿i74790kCPU:这款CPU采用22纳米制程工艺的框架,它的默认频率是4.0到4.4Ghz...

电脑怎样激活win10系统(电脑怎么激活window10)
  • 电脑怎样激活win10系统(电脑怎么激活window10)
  • 电脑怎样激活win10系统(电脑怎么激活window10)
  • 电脑怎样激活win10系统(电脑怎么激活window10)
  • 电脑怎样激活win10系统(电脑怎么激活window10)
nvidia旧版本驱动下载(nvidia新版本驱动)
nvidia旧版本驱动下载(nvidia新版本驱动)

没法装,n卡本身不具备装旧版驱动的功能一、首先在本机电脑内鼠标左键双击打开“驱动人生”(若电脑上无此软件,可以在各大软件市场内下载安装)。二、打开驱动人生软件后,点击“立即体检”进行驱动扫描。三、驱动扫描完成后,点击显卡右边的“箭头”打开驱...

2025-12-18 20:51 off999

怎么解开别人的wifi密码(如何解开别人的wifi密码)

别人的无线网络密码是很不容易破解的,如果人家是愿意分享的,可以在手机上下载"Wifi万能钥匙"注册登陆成功后连接其无线wifi1、以现有的技术手段,是没有办法破解WPA的加密方式(现在...

电脑突然关机(电脑突然关机像断电了一样 再也打不开)
电脑突然关机(电脑突然关机像断电了一样 再也打不开)

如果是插电源的电脑开着突然就关机了,可能是线路接触不良或者是没电了,导致的开着就关机了,如果是你的电脑是充电的那一种可能是你的电池的电量用完了或者是电池的线路接触不良导致的开着突然就关机了,你可以排查一下线路。1、如果你使用的是笔记本电脑,...

2025-12-18 19:51 off999

win7重装系统一直反复重启(win7重装系统无限重启)

WIN7的系统装重复了,可以将原安装的系统删除,方法如下:1、如果以前的windows是安装在C盘上的话,点击桌面上的计算机,选中C盘,鼠标右键选择属性;2、点磁盘清理;3、点清理系统文件,点确定;4...

电脑如何格式化sd卡(电脑格式化sd卡,提示写有保护)

要在电脑上格式化SD卡,可以按照以下步骤:1.将SD卡插入计算机的SD卡读卡器中。2.打开“我的电脑”或“此电脑”,找到SD卡在计算机上的驱动器号(比如E盘)。3.右键单击SD卡驱动器,选择“格...

系统检测不到机械硬盘(系统检测不到机械硬盘怎么办)

第一,我们需要确认一下机械硬盘是否连接正常。可以检查一下硬盘的电源线和数据线是否插紧,是否松动或者断开。如果发现有松动或者断开的情况,可以重新插上并确保插紧。如果硬盘连接正常,但电脑仍然无法读取,那么...

路由器管理平台登录(路由器管理平台登录网址)

路由器的用户登录入口地址是:tplogin.cn电信运营商定制款登录地址是:192.168.2.1或者192.168.8.12、华为(容易)路由器华为路由器跟荣耀路由器只有IP地址,没有域名,它是...

directx修复(DirectX修复工具官网下载)

使用DirectX修复工具很简单。首先需要下载并安装工具,然后打开工具并按照界面提示进行操作即可。工具的作用是自动检测系统中可能存在的DirectX问题,并尝试修复它们,从而保证计算机游戏等应用程序的...

网易邮箱app官方下载安装(网易邮箱163)
网易邮箱app官方下载安装(网易邮箱163)

有些东西调用外部下载软件(如迅雷)是无法下载的,有时下载后不能正常打开,请尝试:在所要下载的文件上点击右键,选择“目标另存为”,也许就能成功下载。下载从网易163邮箱发来的云附件的步骤如下:1.成功登录网易邮箱后,我们点击页面左上角的“收件...

2025-12-18 16:51 off999

取消回复欢迎 发表评论: