安装pyinstaller打包EXE

news2024/11/16 12:49:45

安装pyinstaller 

pycharm 左下角,打开包管理器

 左上角输入要搜索的包

右上角点击安装 

安装完后在 File - Settings - Projecxt:XXX 中设置 Python Interpreter

设置系统环境变量

打包时报错:找不到pyinstaller命令

pyinstaller : 无法将“pyinstaller”项识别为 cmdlet、函数、脚本文件或可运行程序的名称:

需要设置系统环境变量后,在当前路径才会认识这个命令。

将鼠标放到pyinstaller上面,会出现包存放的路径,

存放包路径:C:\Users\Administrator\AppData\Roaming\Python\Python310\site-packages

Scripts路径:C:\Users\Administrator\AppData\Roaming\Python\Python310\Scripts

找到与存放包同级的文件Scripts,添加的系统变量环境是同级的Scripts!!!!!

找到包的存放路劲只是为了方便找到Scripts文件,需要添加到环境变量的是Scripts路径。(这只是我的路径,与你们不一样)
 

我的电脑 - 属性 - 高级系统设置

 

 

 

 改了系统变量后,记得重启ide

设置图标

只能是ico文件才能设置为图标,png和jpg格式是不接受的,我这里给一个免费的png和jpg格式转ico格式的网站,可以更具自己的需求设置图标大小,转化网址点击下方链接

https://png2icojs.com/zh/

https://app.xunjiepdf.com/img2icon/

输入结束后点击回车等待完成即可

控制台命令格式

1.进入Terminal控制台进行编辑

2.转入对应路径(可看情况忽略)

ps:如果你的文件本身就位于项目下,可忽略此步骤

3.控制台内输入代码

输入:pyinstaller -F -w -i 图标路径(.ico) 运行文件名

例:

Pyinstaller -F py_word.py 打包exe
 
Pyinstaller -F -w py_word.py 不带控制台的打包
 
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe图标打包

-w是指程序启动的时候不会打开命令行。如果不加-w的参数,就会有黑洞洞的控制台窗口出来。比如在刚才的脚本里我加一行print('Hello World!'),那么就不要放-w参数了,不然运行会报错,毕竟Hello World!需要在命令行里打印出来。此外,-w参数在GUI界面时非常有用。

最后的-i chengzi.ico就是指设置自己的图标图案,因为默认打包图片是下图这样的。这个参数也可以写成--icon=chengzi.ico
 

1.打包成功的显示

创建成功后,会生成以下文件(前两个文件夹可以直接删掉):

dist文件夹中的exe即为我们所需要的可执行文件,可以打成压缩包发给朋友试试!

2.找到exe文件的路径

3.完成

引用丢失问题

我查找了大部分运行exe文件没有执行的情况,并且对应我自己的实际情况我发现几乎80%失败的原因都是没有将相应文件引用进来。

第一种方法:在自己的虚拟环境中找到该模块的dll,手动复制粘贴到打包后目录即可:

若项目中有文件用到了相对路径,需要把那些用到的文件再拷贝一份放到dist目录下。

 

ps:对于其他文件的引用也是类似的解决方法

如果你的程序中有图片等资源,是需要根据程序中的相对路径加入到dist文件中,也要在.exe同目录中加入images的文件夹(图片资源)

如果原.py程序使用了图片等素材,并且添加图片是相对路径(同一个文件夹下可以不使用绝对路径),打包文件后,需要将图片等素材拷贝一份放在打包后的文件夹下,否则运行.exe程序会找不到图片素材。

如果原.py程序使用图片添加的是绝对路径,在本地电脑上运行时可能不会发现错误。但是你将打包后的文件发给另一台机器,运行.exe程序会报错,大概意思是“根据你写的绝对路径找不到图片等素材”,即使你在文件夹下拷贝了素材,但是绝对路径也是错误的,所以,最好使用上一种方法。

2)打包的主文件问题

只能指定一个要打包的模块,也就是启动模块

发布后,可执行文件执行路径不能有中文(最好也不要有空格)

启动执行的文件中不要有下面这种判断,否则可执行文件执行会没有任何效果

  if __name__=='__main__':
将exe放到其他机子上运行,弹出“找不到msvcr100.dll“ ,手动将”msvcr100.dll“拷贝到dist目录下即可

3)养成良好习惯

写代码的时候应当养成良好的习惯,用什么函数导什么函数,不要上来就import整个库,最后你会发现你一个100KB的代码打包出来有500MB,全是库
 

第二种方法:修改spec文件的时候设置好导入位置,打包时会自动识别

打包过程找不到自己自建模块如

ModuleNotFoundError: No module named 'core'

可以将模块添加到datas里注意复制后的名字('core','core')最好是原名(个人经验)。

还可以将自己的模块直接复制到site-packages 下面,再打包。

打包成功却不能正确执行,进程无法阻塞,.exe一直在循环

这是因为在调用某些模块的时候,也是进程,而在多进程中,你程序中的进程不会被阻塞,而一直循环起进程。用下面方法去解决,注意下面代码要放在代码最开始在import 模块之前。

from multiprocessing import freeze_support

freeze_support()

多层树形依赖

特殊情况dll都打包进exe了,还会有这类DLL not found issue

  • 可能是由于该dll本身也有依赖,因此需要将dll在当前开发环境的依赖包,同样放到目标环境exe目录中(或直接打包进exe),才可以正确执行

否则就算将源码迁移到另一台机器,运行时也是报同样的错误,因为该dll依赖在目标机器系统内不支持

通过 dependencywalker 工具来查找该Dll的依赖包:

  • Dependency Walker (depends.exe) Home Page

下载后,打开depends.exe工具,将相关dll导入,即可找到所有依赖,

在这里插入图片描述

例如我这里使用的dll有4个依赖:

在这里插入图片描述
在这里插入图片描述

然后在 C:\Windows\System32 下,依次找到所依赖的库文件

在这里插入图片描述

复制到exe执行目录,即可正常运行。
在这里插入图片描述

为了优化解决办法,可以把所有依赖的dll都打包进exe中,方便在目标PC运行,
可参考: Python通过PyInstaller 将DLL文件直接打包进exe,

打包后运行闪退


我遇到这个情况,不打包运行的好好的,打包后一运行就闪退,

不要用双击模式运行,可以用cmd或者powershell运行exe,这样闪退后打印出报错信息

报错缺少模块,这种情况很可能是没有在虚拟环境内部进行打包,详见以下文章描述,严格执行打包流程。

https://www.cnblogs.com/new-june/p/11968037.html

解决pyinstaller打包涉及uiautomation截图时出现的dll找不到的错误_pyinstaller打包缺少dll_游一尘的博客-CSDN博客

包体压缩

刚刚生成的exe实在太大了,300多M的软件程序想用微信传一下都费劲。

我也试过很多方法,比如:修改spec文件自定义打包、pipenv 虚拟环境、使用开源的upx压缩等等,但是往往要么过程比较麻烦,要么成功率不高(压缩成不成功全看脸)。

而我要分享的,是自己一直在用的,最简单且成功率极高的方法——conda创建虚拟环境。
 

Python打包为什么大
在压缩打包之前,先简单说一下为什么Python打包过大?

Python打包exe,不但体积大而且运行奇慢。解释型语言大都是这个样子,只不过Python尤其突出。要解决大而慢,只能用编译型语言,如C,C++,甚至VB都好很多,体积最小的是汇编。[1]

此外,还有知乎大佬说是因为“Anaconda里内置了很多库,打包的时候打包了很多不必要的模块进去,要用纯净的Python来打包。”

所以我们可以模拟一个新环境,其中只安装我们本次打包所必要的工具包即可。

那最适合的就是——虚拟环境了!

虚拟环境
Python创建虚拟环境的方法有很多,而我是个Anaconda忠实用户,如果你跟我一样,那就简单了。(大家也可以使用Virtualenv、Pipenv来设置虚拟环境,善用搜索,方法大同小异)

先记几个命令,很简单

conda create -n 虚拟环境名字 python==3.6  #创建虚拟环境
 
conda activate 虚拟环境名字  #激活虚拟环境
 
conda deactivate  #退出虚拟环境
从开始菜单运行“Anaconda Prompt”,出现的界面输入创建虚拟环境的指令。成功创建了一个名字为aotu,且基于python版本3.6的虚拟环境。

制作Installer安装文件

用Inno SetUp将exe文件制作成安装包

使用Inno SetUp制作安装包_鱼生艰难啊的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动控制原理模拟卷4

自动控制原理模拟题四 Question1 仓库大门自动开闭控制系统原理图如下图所示,说明系统自动控制大门开闭的工作原理并画出系统方块图; 解: 当合上开门开关时,电位器桥式测量电路产生一个偏差电信号;此偏差电压经放大器放大后,驱动伺服电动机带动绞盘转动,使大门提起;与…

五、Locust之HTTP用户类

HttpUser是最常用的用户。它增加了一个客户端属性,用来进行HTTP请求。 from locust import HttpUser, task, betweenclass MyUser(HttpUser):wait_time between(5, 15)task(4)def index(self):self.client.get("/")task(1)def about(self):self.client.…

Python标准库 --- json库

目录 一、简介 二、属性 三、数据格式 一、简介 Json,全称JavaScript Object Notation,也就是JavaScript对象标记,通过对象和数组的组合表示数据,虽然构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。J…

ftp-vsftpd(Centos)

一.关闭selinux跟防火墙 setenforce 0 systemctl stop firewalld 二.安装vsftpd yum install vsftpd -y 三.创建虚拟用户与目录并申请证书 mkdir /webdata 根目录 chmod 777 /webdata/ useradd webadmin 上传的文件映射为webadmin vim user webuser虚拟用户 通过d…

Android---内存泄漏检测核心原理

目录 LeakCanary 核心原理 LeakCanary 检测对象的类型 ReferenceQueue 与 WeakReference LeakCanary 里的监控列表与保留列表 常见内存泄漏案例 1. 单例导致内存泄漏 2. 静态变量导致内存泄漏 3. 非静态内部类导致内存泄漏 4. 未取消注册或回调导致内存泄漏 5. Timer…

paddleocr 实操笔记 (前向后梳理)

要点: 参考: 基于PaddleOCR的数字显示器字符识别 工业仪表数值识别 前言 问题分析 要处理电表中的数据,可以分为步骤,拆解为以下问题: 感兴趣区域定位问题OCR读数问题 针对问题1,经过实验与探索,也找到…

黑马---Redis入门到实战【基础篇】

一、初识Redis 认识NoSql redis是键值数据库,没有表、没有约束,存的都是键值对,称为NoSql数据 NoSQL VS SQL 认识Redis Redis诞生于2009年,全称Remote Dictionary Server,远程词典服务器,是一个基于内存…

开篇:为什么学习 Go 语言

简介 Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算、微服务、分布式的发展而迅速崛起,跻身主流编程语言之列,和 Java 类似,它是一门静态的、强类型的、编译型编程语言,为并发而生…

高等数学笔记(上下)

目录 不定积分定积分微分方程线性微分方程解的结构常系数齐次线性微分方程常系数齐次线性微分方程特解的求法 计算机解法 不定积分 第一类换元积分法:灵感来自于复合函数的求导,利用中间变量替换得到复合函数的积分法:设 f ( u ) f(u) f(u)具…

【Redis7】Redis7 事务管道发布订阅

【大家好,我是爱干饭的猿,本文重点介绍Redis7 事务、管道和发布订阅。 后续会继续分享Redis7和其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】 上一篇文章:《【Redis7】Redis7 持…

Qt扫盲-QXYSeries理论总结

QXYSeries理论总结 一、概述二、常用函数介绍1. 维护点2. 绘图相关3. 绘制标签 三、信号说明1. Point 增删相关2. Point 鼠标相关3. 图变化相关 一、概述 QXYSeries 类是折线图、曲线图、散点图的基类。这个类其实就是维护的是图线的相关信息,就比如是这个线条的颜…

5、cmake的简单认识及CMakeLists.txt的编写语法

文章目录 1、cmake是什么(1)cmake的两大功能 2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)(1)cmake常见预定义1)常见的预定义变量2)系统信息预定义变量3)开…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号:AI-era Meta的LLaMA模型开源,让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到,一次意外的LLaMA泄漏,竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

Linux系统网络传输之端口详解

Linux系统网络传输之端口详解 1、端口的概念2、安装namp3、查看端口占用情况4、安装net-tools5、查看指定端口占用情况 1、端口的概念 计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xf…

《花雕学AI》深度测试ChatGPT国内镜像站:超简单提示词的猫娘角色扮演,真的好神奇啊!

偶然看过一篇讲解如何使用ChatGPT调教猫娘的文章,有六个步骤,许许多多的调教提示语,让我感觉这是一件非常复杂与专业的事情。今天有空,于是就想先从简单的开始尝试一下。我使用了最简单的提示词:”ChatGPT角色扮演猫娘…

分布式事务Seata实践入门

1 前言 现在应用基本上都是分布式部署,那么针对分布式事务问题,也有对应的解决方案。经过简单的调研,最后选择了阿里的 Seata 组件,来实现分布式事务。 Seata是2019年1月份,蚂蚁金服和阿里巴巴共同开源的分布式事务解…

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念 服务器操作系统安装步骤 记录一下服务器操作系统安装过程,虽然简单但还是有一些坑需要注意,本次使用的是联想服务器ThinkSyst…

VS2019中Ctrl+左键不起作用和控制台不驻留(cmd窗口闪退)

1、关于Ctrl左键不起作用 解决:在线装个插件就行。 工具>>扩展和更新 联机>>VS库>>所搜插件“GO TO Definition” 安装,重启VS即可。 2、关于控制台不驻留 当然这个问题解决方案有很多,这个是首选吧

[Java·算法·中等]LeetCode105. 从前序与中序遍历序列构造二叉树

每天一题,防止痴呆 前言题目示例分析思路1题解1分析思路2题解2 👉️ 力扣原文 前言 二叉树前序遍历的顺序为: 先遍历根节点; 随后递归地遍历左子树; 最后递归地遍历右子树。 二叉树中序遍历的顺序为: 先递…

HCIP-6.9BGP路由反射器原理与配置

路由反射器原理与配置 1、路由反射器概念1.1、路由反射器原理:1.2、多集群路由反射器1.3、备份路由反射器2、路由反射器配置3、路由反射器防环机制 1、路由反射器概念 IBGP的水平分割,IBGP 1只能update一跳,就是说在IBGP 2 设备收到IBGP 1设…