Python程序打包exe可执行软件教程

news2024/12/28 5:50:09

1、前言

Python虽好,但是平时我们写的代码都是.py脚本文件,必须要在Python环境下 才可以运行。如果一台电脑没有安装Python是无法运行我们的程序的。当然你也可以选择随身携带安装包。 不过终究是有些麻烦。那么有没有什么办法,能把我们编写的Python代码转换成exe文件呢?这样不管到哪, 只要能打开exe就可以运行我们的程序。当然,办法是有的。网上一搜就有py2exe、pyinstaller等包可以实现 我们想要的这个功能。这里我们选择pyinstaller。

2、Pyinstaller的使用

(1)安装PyInstaller

PyInstaller官网地址在这,点击进入。其官网首页非常简洁。截图如下:

官网的“快速开始”建议我们直接通过pip安装。然后在控制台转移到脚本所在的目录,直接”pyinstaller yourprogram.py” 即可生成exe文件。十分方便。

首先打开控制台,输入”pip install pyinstaller”,然后就是静待安装。

(2)使用PyInstaller

为了测试它的功能到底好不好用,这里特意挑选了一段稍微复杂点的代码,如下:

# coding=utf-8
import numpy as np
import cv2


def nothing(x):
    pass


path = raw_input("Input the path of image:\n")
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

threshold = 128
result = gray

cv2.namedWindow("Threshold Test")

cv2.createTrackbar('Threshold', 'Threshold Test', threshold, 255, nothing)
cv2.createTrackbar('0:Off 1:On', 'Threshold Test', 1, 1, nothing)

while 1:
    cv2.imshow('Threshold Test', result)

    k = cv2.waitKey(1) & 0xff
    if k == 27:
        break

    threshold = cv2.getTrackbarPos('Threshold', 'Threshold Test')
    s = cv2.getTrackbarPos('0:Off 1:On', 'Threshold Test')

    if s == 0:
        result = gray
    else:
        ret, result = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)

cv2.destroyAllWindows()

这段代码引用了比较大的OpenCV函数库。而且有控制台部分,也有图形界面部分。算是比较全的覆盖了 可能用到的情况。这段代码的功能是首先用户在控制台输入一张图片的地址,然后弹出一个二值化界面。 在该界面上有一个滑动条,可以拖动改变二值化阈值,另一个可以打开或关闭二值化效果。演示图如下:

下面就把这个脚本文件变成一个独立运行的exe。首先打开控制台,然后切换到该文件所在的目录下。 注意首先要切换盘符,直接输入”D:”或其它即可换到该盘下。然后再输入”cd D:\output"换到该目录下。 直接cd是换不到D盘的。

换到该目录后,输入”pyinstaller threshold.py”,按回车等待即可。生成时间取决于代码多少和复杂程度。 完成后如下图所示。

再次打开我们的目录,可以发现多了几个东西。

我们想要的exe可执行文件就在dist文件夹中。所以我们只需要将整个这个文件夹随着携带,就可以在没有Python 的机器上运行我们的程序了。而至于其它的build文件夹和spec文件则是生成过程中产生的文件,我们可以不用管它。

可以看到PyInstaller把我们引用的OpenCV库原封不动地包进来了,此外还有其它一些与界面有关的东西。 打开dist中的threshold.exe便可以成功运行程序,如下所示。

如图可以看到,首先打开了一个黑框框要我们输入图片路径,然后弹出了界面。和我们预想的一样,完美达成目标。

(3)只打包一个exe软件

上面其实我们已经实现了我们的目标。但有时我们不想拷给别人一大堆东西。只有一个exe文件。这样也很好办,我们 只需要在生成的时候,在文件名前面加上”-F”这个参数即可。

输入”pyinstaller -F threshold.py”。输出结果就只有一个exe了。

对比之前的那个exe和这个exe,可以发现这个更大了(29.4 MB),而上面的那个exe只有3.36 MB。但是整个dist文件夹的 大小是75.9 MB。所以从最终结果上来说,这一种方法更省空间。

但经过测试,它虽然省空间,也更方便(只有一个文件),但有点小问题,那就是程序启动稍微慢一点。同样的代码使用第一种 方式生成的exe是可以做到秒开的。而第二种方式的exe,经过记录,从打开到控制台弹出输入路径提示,平均在10秒左右。 个人认为可能的原因在于他把那么多文件压缩到了一个文件中,所以每次启动都要先解压缩那些文件到缓存中,而文件很多, 且压缩比应该也很高,必然导致很慢。如图所示是第一种方法生成的文件,有将近1000个文件。

所以说,鱼和熊掌不可兼得。如果说你不介意程序的启动速度或者说打开一次可以用很久,为了追求方便,那可以使用第二种方法。 如果你的程序需要经常打开,那还是建议你采用第一种方法吧。毕竟谁也不想每次开都浪费几秒钟的生命, 而且整个文件夹拷给别人也就是一个压缩包的事。个人猜测如果代码比较简单,生成的文件较少。那么可能两者差异应该不会很大。

此外PyInstaller还支持自定义图标等等,以上只是介绍了基本功能,更多功能可以去看官方的Manual,点击阅读

3、踩坑记录

在后续使用过程中,发现了PyInstaller的一些弊端,在这里简单总结一下,并给出解决办法。

(1)不支持中文

首先是不支持中文,或者说不支持UTF-8编码。PyInstaller只支持ASCII编码。下面分别对各种含有中午的情况进行测试。

(2)生成路径含有中文

如生成路径为:D:\新建文件夹>pyinstaller 060302.py 。经过测试,生成路径含有中文名,是可以无法生成成功的。如下所示。

提示错误为ascii解码器无法识别路径索引为3的地方的’0xd0’字符。所以生成路径不能有中文。

(3)运行路径含有中文

根据上面的结论,生成路径不含中文,生成成功。然后我们将dist文件夹拷贝到一个中文路径下,如下图所示。

将dist拷贝到“测试”文件夹下,经过实验,发现是可以正常运行的。因此运行路径没有限制,可以含有中文。 同时可执行文件的名称也可随意修改,包含中文,因为文件名本身也是路径的一部分。路径可含中文,文件名 同样可以包含中文名。

(4)代码中含有中文

如果在注释中含有中文,需要在python文件第一行增加# coding=utf-8,否则python下就会报错。 如果在代码本身,如控制台提示语句中含有中文,同理添加utf-8。这样可以保证在python下不会出错。 但即使添加了这句话,在输出的控制台还是会有问题。因为PyInstaller输出的控制台程序不支持 中文。如下图所示,“请输入内容:”在这里变成乱码了。

又如需要对一个中文字符串进行处理时,spilt某个中文字符,在python下正常,但是转换后就会报错。 如果在控制台输入语句中含有中文,转成exe后可以支持输入中文。如下。

总结一下也就是说,如果想转成exe后还可以正常使用的话,那就不要在执行代码中包含中文字符,否则必然报错。

(5)控制台一闪而过

准确来说这不是PyInstaller的问题,而是Windows的问题。即使是用C/C++写的控制台程序,在Windows下运行结束后 都会自动退出。由于运行速度很快,给人的感觉就是一闪而过。在C++中解决这个问题是在代码最后加上一句system('pause'), 或是加上一句输入语句等待用户输入。所以在Python中的解决方法类似,也有两种解决办法。

  • 增加输入语句

在代码的最后增加raw_input()即可,如果想更完善,可在括号的提示语句里写上”Press any key to exit.”。

raw_input("Press any key to exit.")

转为exe后在控制台下运行的效果如下:

完美实现了我们想要的效果。

  • 强制暂停

类似于C++下面的system('pause'),这里导入os包,然后添加语句。

importosos.system('pause')

运行效果如下所示:

  • 控制台不支持粘贴复制

在控制台中,发现不管是Ctrl+V还是鼠标右键都无法粘贴。其实并不是不支持,而是需要设置一下。 首先点击窗口左上角的图标,然后找到“属性”。

然后在打开的选项中找到“快速编辑模式”,选中并点击确定。这样就支持复制粘贴了。

注意在控制台中复制粘贴是通过鼠标右键完成的。选中某段文字单击右键即可复制,复制某段文字后, 回到控制台单击右键即可粘贴。

  • 可能是某些库没有被打包进来

可以在CMD中看看软件报的错误,然后从Python/lib/site-packages找到该包复制到打包后的文件夹中即可。

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

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

相关文章

【扬尘监测系统】让扬尘管理迈向“智慧化”

扬尘是指道路与管线施工、物料运输、物料堆放、植物栽种和养护等活动产生的粉尘颗粒物对大气造成的污染。 治理扬尘污染,我们应该从源头出发,进行“防治”。扬尘监测系统是利用现代科学技术对扬尘的排放程度进行客观、科学、准确的量化和评价的设备&…

零信任-易安联零信任介绍(11)

​目录 ​易安联零信任公司介绍 易安联零信任发展路线 易安联零信任产品介绍 易安联零信任架构 易安联零信任解决方案 易安联零信任发展展望 易安联零信任公司介绍 易安联是一家专业从事网络信息安全产品研发与销售,是行业内领先的“零信任”解决方案提供商&…

ChatGPT或将引发新一轮失业潮?是真的吗?

最近,要说有什么热度不减的话题,那ChatGPT必然榜上有名。据悉是这是由美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类…

6.2 构建 RESTful 应用接口

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战:实现 Web API 版本控制 6.2 构建 RESTful 应用接口 6.2.1 Spring Boot 对 RESTful 的支持 Spring Boot 提供的spring-boot-starter-web组件完全…

Pygame中画圆

在Pygame中,可以通过draw模块下的circle()函数来进行画圆。1 准备工作的完成在画圆之前需要导入Pygame模块、初始化Pygame模块以及创建Surface对象。import pygame from pygame.locals import * pygame.init() screen pygame.display.set_mode((600,500))其中&…

SpringBoot实现 内置 定时 发送邮件功能

前段时间因为公司用了定时任务,所以写了2篇定时任务的文章,一篇是正常如何在Springboot 编程中如何去使用quartz ,第二篇就是 正常业务性的增删改查,今天我们来看下如何使用 quartz 去定时给女朋友发邮件 ,结尾会放上完…

智能电子办公标牌解决方案

一、WiFi智能电子标牌 智能电子办公标牌将它放在任何地方,以可视化会议日程、约会信息、行动计划和协作任务,使团队能够更有效地工作并更好地利用空间。 优势: ● 超低功耗,充一次电管用一年,支持Type-C接口充电 ●…

Linux之进程

一.冯诺依曼体系 在计算机中,CPU(中央处理器)是不直接跟外部设备直接进行通信的,因为CPU处理速度太快了,而设备的数据读取和输入有太慢,而是CPU以及外设直接跟存储器(内存)打交道&am…

Python 之 Matplotlib 柱状图(竖直柱状图和水平柱状图)、直方图和饼状图

文章目录一、柱状图二、竖直柱状图1. 基本的柱状图2. 同位置多柱状图3. 堆叠柱状图三、水平柱状图1. 基本的柱状图2. 同位置多柱状图3. 堆叠柱状图四、直方图 plt.hist()1. 返回值2. 添加折线直方图3. 不等距分组4. 多类型直方图5. 堆叠直方图五、饼状图 pie()1. 百分比显示 pe…

初步使用MSYS2

在此镜像站点下载, https://mirror.tuna.tsinghua.edu.cn/help/msys2/ 根据资料, MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境。同时它也是一个在Cygwin (POSIX …

FPGA 10M50DCF672C7G/10M50DCF672C8G/10M50DCF672I7G工业、汽车和消费应用

FPGA现场可编程门阵列 10M50DCF672C7G/10M50DCF672C8G/10M50DCF672I7G 封装FBGA672FBGA672封装图(明佳达电子)描述MAX 10器件是单芯片、非易失性低成本可编程逻辑器件(pld),用于集成最优的系统组件集。MAX 10设备的亮点包括:内部存储双配置闪…

Spring Data JPA 中 CrudRepository 和 JpaRepository 的区别

1 问题描述Spring Data JPA 中,CrudRepository 和 JpaRepository 有何区别?当我在网上找例子的时候,发现它们可以互相替换使用。它们有什么不同呢?为什么你习惯用其中的一个而不是另一个呢?2 CrudRepository 和 JpaRep…

ArcGIS网络分析之发布网络分析服务(二)

在上一篇中讲述了如何构建网络分析数据集,本篇将讲解如何发布网络分析服务。本文将使用上一篇中建立的网络数据集,下载地址在上一篇博文的最后已给出。 之前我们已经实现了基于ArcMap中的网络分析,但是仅仅支持本地是万万不够的,这里我们的目的就是将我们建好的网络分析图…

【OJ】两个圆

📚Description: 直角坐标系内现有两个半径相等的圆,问两圆的位置关系。 位置关系有:重合,相切,相离,相交; 若两圆相交,需要求出两圆的重叠面积。 ⏳Input: 输入包含多组数据&a…

【项目精选】户籍管理系统(视频+论文+源码)

点击下载源码 当今社会人们生活质量越来越高,人们对生活品质的追求不断提升,对于孩子求学,变更住所等情况时有发生,因此对于户籍变动管理就显得十分重要,管理用户的户籍信息可以有效防止信息错乱,信息管理过…

百度沈抖:文心一言将通过百度智能云对外提供服务

2月17日,在2023 AI工业互联网高峰论坛上,百度智能云宣布“文心一言”将通过百度智能云对外提供服务,为产业带来AI普惠。 百度集团执行副总裁、百度智能云事业群总裁沈抖表示,“文心一言”是基于百度智能云技术打造出来的大模型&a…

A Time Series is Worth 64 Words(PatchTST模型)论文解读

摘要 我们提出了一种高效的基于Transformer设计的模型,用于多变量时间序列预测和自我监督表征学习(self-supervised learning)。它基于两个关键部分:1、将时间序列分隔成子序列级别的patches,作为Transformer的输入&a…

Allegro负片层不显示反盘的原因和解决办法

Allegro负片层不显示反盘的原因和解决办法 在用Allegro做PCB设计的时候,负片设计是较为常用的一种方式,有时会出现打开负片层却看不到反盘的情况,如下图 L2层是负片层 L2层仍然只能看到盘 如何才能看到反盘显示的效果,具体操作如下 首先确定L2层层叠里面设置的是负片

java ssm爱宠宠物医院挂号预约系统管理系统设计与实现

本课题所实现的宠物医院网站是基于网页,它可以实现网上预约挂号,评价等基本功能。用户只要手边有一部手机或者一台电脑,可以上网浏览网页,便可以使用本系统,没有时间和地点的限制,使得就医预约,…

枚举类(enum)

定义:在某些情况下,一个类的实例对象是有限且固定的,可将该类称为“枚举类”。枚举类是JDK 1.5 之后提出来的。例如:四季只有春夏秋冬4个季节,性别只有男女2个,故四季类和性别类均可称为“枚举类”。 在自…