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

pyinstaller打包python程序高级技巧

cac55 2025-08-30 00:49 4 浏览 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)

相关推荐

将100个EXCEL工作表建立目录索引,同事用1小时,我用1分钟

EXCEL工作簿中的工作表多了,查找某个工作表就比较麻烦,可以用建立目录索引的方式来实现快速定位到指定的工作表。目录索引如何建立呢?相信插入链接的操作好多人都会,但是如果工作表太多了,用这种方法操作时...

在工作中用word文档做目录常见的几种方式

制作Word文档目录时,常见的三大方法分别是使用内置标题样式生成目录、使用大纲视图生成目录以及手动创建目录。以下是每种方法的详细步骤,帮助你轻松掌握目录制作的技巧。一、使用内置标题样式生成目录设置标题...

1分钟批量生成100个文件夹_1分钟批量生成100个文件夹

1分钟批量生成100个文件夹。大家好,现在来学习一下利用Excel一分钟之内以指定的名称创建100个文件夹如何操作?现在来进行实操一下。现在现有的数据有编号和姓名,名字是100个,这是以这100个名字...

如何生成文件目录——《超级处理器》应用

如果我们有很多文件,查看起来很不方便,怎么办?我们可以将所有文件,生成一个文件目录,这样想看哪个文件,直接点击目录中对应的文件名就可以打开了。我们以下面文件为例,做一个文件目录(不限于Excel...

表格技巧—用Excel生成文件夹目录的方法

在日常工作中,有时候我们需要生成很多的文件夹、报表文件,需要生成很多的工作表单。这些事情如果手动来做太费时费力了,那么在Excel里怎么生成文件夹目录呢?Excel文件夹生成目录有两种方法,现在我们就...

拒绝手动更新!3步制作Excel自动更新智能目录,效率飙升300%

作为专注Excel技巧分享的博主,我太清楚大家在处理长文档时的痛苦了。上周粉丝群里有位宝妈哭诉:她花3小时整理的200页产品目录,因为新增了10款产品,目录页码全乱套!这种经历我太有共鸣了,今天就教大...

如何自动生成目录???_文档如何自动生成目录

第一步:先拟标题,一级标题完成后可以开始二级标题的撰写;第二步,打开【视图】中的导航窗格;第三步,打开【引用】中的【目录】,选择合适的级别目录...

目录页码不用手动输,自动生成超简单

写长文档时,手动标目录页码不仅麻烦,改内容后还容易出错。其实不管用Word还是WPS,都能自动生成带页码的目录,几分钟就能搞定。下面用简单的步骤教你操作,小白也能轻松学会。先说说Word里的...

PPT自动生成目录,3步告别手工整理,效率提升80%

你知道吗?据统计,职场人士平均每周要制作2.3份PPT,其中30%的时间都耗在了手动整理目录上。看着密密麻麻的页面,一个个复制标题、调整格式、对齐页码,这种重复劳动不仅费时费力,还容易出错。今天教你3...

Word怎么制作目录?用这3种方法,10秒搞定!

你好,我是小智。Word制作目录是一项核心功能,这是每个使用Word的人,必须要掌握的一项技巧。如果你还不会这项技巧,那今天我来给你详细的讲一下,Word制作目录的方法,喜欢记得点赞收藏哦^_^1、...

Excel制作自动更新的目录,2个公式搞定!

如果我们的Excel工作簿里面,表格太多,不好管理,可以花1分钟时间,快速制作一个工作簿目录,快速实现跳转,效果如下所示:以上制作过程,仅用到了2个函数公式,分别是SHEETSNAME和HYPERLI...

Excel制作目录的6种方法,到底哪种才是你的菜?

【温馨提示】亲爱的朋友,阅读之前请您点击【关注】,您的支持将是我最大的动力!在日常工作中,一个Excel文件中往往会创建多个工作表,但要找到需要的工作表,有时会一个个点击工作表标签,要是能生成一个目录...

Excel目录完美的制作方法,新增表格自动更新,还不限制版本

制作可以自动更新的工作表目录,最简单的方法就是利用PowerQuery来获取工作表名称,但是有很多粉丝反映它们的Excel版本不支持,无法使用,今天就跟大家分享另一种解决方法,不限制Excel版本,就...

一键生成Excel目录,自动跳转到需要的工作表,小白也能轻松掌握

如果一个Excel文件中有非常多的工作表。你会使用什么方法来快速跳转到需要的工作表呢?相信很多人都会选择制作一个工作表目录。但是制作工作表目录对于新手来说还是比较复杂的,今天跟大家分享一种方法,只需要...

Excel还能做表格目录,一键生成_excel工作表目录生成

私信回复关键词【CSV】,获取CSV工具,帮你批量转换上百个Excel文件格式!说起表格目录,脑海中蹦出来的第一个词就是「超链接」!我们只需要右键—【链接】—【本文档中的位置】,选择对应的工作表就可...

取消回复欢迎 发表评论: