Python脚本打包成exe,看这一篇就够了!

Stella981
• 阅读 851

腾讯课堂 | Python网络爬虫与文本分析(现在只需198元)~~

Python脚本打包成exe,看这一篇就够了!

来源:凹凸数据

今天就给大家全面总结一下:Python如何打包成exe,以及如何打得足够小。

标准打包

目前比较常见的打包exe方法都是通过Pyinstaller来实现的,本文也将使用这种常规方法。如果对这块已经很熟悉的小伙伴,可以直接下滑到本文下半部分。

为什么要打包?

众所周知,Python脚本不能在没有安装Python的机器上运行。

那我们如果写了一个数据分析/自动化办公的小脚本,想分享给同事小姐姐使用,可她电脑又没有装Python。

这个时候如果将脚本打包成exe文件,微信发送给她,即使她的电脑上没有安装Python解释器,这个exe程序也能在上面运行。岂不美哉?

Python脚本打包成exe,看这一篇就够了!

(当然,想通过帮安装Python跟小姐姐建立感情的话,就当我没说)

安装Pyinstaller

首先我们要先安装Pyinstaller,直接在cmd使用pip命令

pip install pyinstaller 

如果网速太慢可以切换国内源来加速,本文其他部分直接使用国内源,不再重复注释。

Python脚本打包成exe,看这一篇就够了!

pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源

Pyinstaller打包步骤

这里我们拿之前《Python自动化办公 | 同事要我帮忙补写178份Word日报!》这篇的python代码,作为案例来演示。将其中脚本py_word.py,待处理的表格文件workbook.xlsx,以及准备好的软件图标图片chengzi.ico放在了我电脑的F:\py_word目录下(如果大家感兴趣的话,可以在文末下载获取)

Python脚本打包成exe,看这一篇就够了!

1、cmd切换到我们刚刚放文件的目录

Python脚本打包成exe,看这一篇就够了!

2、执行命令Pyinstaller -F -w -i chengzi.ico py_word.py,执行过程特别漫长,就没有录制动图。

执行完毕会发现当前目录多了几个文件夹,打开其中名为dist的文件夹。

Python脚本打包成exe,看这一篇就够了!

已经生成了一个名为py_word的exe应用程序,并且图标也是我们设置的橙子图案,看来已经成功一半了。

要不运行一下,试试能否正常生成word日报?

Python脚本打包成exe,看这一篇就够了!

打包exe后执行

成功运行,可惜就是文件有点大(339M)

Python脚本打包成exe,看这一篇就够了!

Pyinstaller参数详解

说回刚刚执行的命令

Pyinstaller -F -w -i chengzi.ico py_word.py

给大家解释一下其中Pyinstaller的参数,其中-F参数代表制作独立的可执行程序。

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

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

Python脚本打包成exe,看这一篇就够了!

最后稍微总结一下:

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

以上三个是比较常用的参数,其他参数详见下表

Python脚本打包成exe,看这一篇就够了!

Pyinstaller参数大全

ico图片生成

自己做的软件都喜欢放上自己的图标,不过哪来那么多ico图片呢?

一个是可以找专门的ico图片网站,不过都很小众,图片库也很小。

另一个是可以自己生成,这里就给大家分享一个网站,可以把其他格式图片转成ico格式:https://app.xunjiepdf.com/img2icon/

Python脚本打包成exe,看这一篇就够了!

ico图片格式转换

压缩打包

好了,小伙伴们

来到了最激动人心的时刻,刚刚生成的exe实在太大了,300多M的软件程序想用微信传一下都费劲。

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

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

Python脚本打包成exe,看这一篇就够了!

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的虚拟环境。

Python脚本打包成exe,看这一篇就够了!

在创建过程中需要回复(y/n),Yes,再激活虚拟环境

Python脚本打包成exe,看这一篇就够了!

conda安装的虚拟环境,会把虚拟环境的目录生成在anaconda安装目录下的env目录下。

Python脚本打包成exe,看这一篇就够了!

当然我们也可以在刚刚的窗口,使用命令conda info --envs,来查看conda环境下所有的虚拟环境

Python脚本打包成exe,看这一篇就够了!

安装所需的库

上面我们已经创建并激活了名为aotu虚拟环境,输入conda list可以查看当前虚拟环境里已经安装的库。

Python脚本打包成exe,看这一篇就够了!

我们打开所要打包的Python脚本,对比上图,发现pandasdocx这两个库还需要额外安装。当然,也不能缺了打包必不可少的pyinstaller库。

Python脚本打包成exe,看这一篇就够了!

待打包脚本

安装库的过程不再赘述

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandaspip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docxpip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

安装后再看

Python脚本打包成exe,看这一篇就够了!

已成功安装,还有一些因为这几个库所附带安装的,就不管他们了。

Pyinstaller打包步骤

这里就不再重复了,只换个苹果图标试试

Pyinstaller -F -w -i apple.ico py_word.py

Python脚本打包成exe,看这一篇就够了!

生成

Python脚本打包成exe,看这一篇就够了!

成功压缩到29.8M,如果不导入pandas这位大神,应该就可以10多M了

运行一下,毫无问题

Python脚本打包成exe,看这一篇就够了!

最后再简单总结一下虚拟环境+打包的全过程(只三步):

#创建虚拟环境conda create -n aotu python=3.6#激活虚拟环境conda activate aotu#Pyinstaller打包Pyinstaller -F -w -i apple.ico py_word.py

总结一些小坑

1、说起来还是有点玄学,上文中一模一样的过程我在两个电脑都执行过一遍。在其中一个上显示缺少xlrd这个库,安装后成功打包,也是一样的大小。小伙伴们可以在文末获取文件,也试试。

2、在安装库是要注意一些库名,比如docx这个库不要pip install docx,而是需要

pip install python-docx

还有一些库可能因为版本不同导致不能使用,多碰碰壁就好了。

3、为了防止打包时候有些库没安装好,可以先在虚拟环境中执行一下Python脚本。运行无误的话再打包,比较保险。

Python脚本打包成exe,看这一篇就够了!

4、最后,如果想要删除虚拟环境的话,可执行下方命令

conda remove -n aotu--all 

5、打包为exe的话,版本尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序,但是如果不考虑32位系统的话无所谓,直接python64位版本直接打包就可以,只是只能在win64位系统上跑。[2]

下载链接

打包案例所用素材:

链接:https://pan.baidu.com/s/1GsASKTrIqBaqO5UeVnC2wA 提取码:kxpy

Python脚本打包成exe,看这一篇就够了!

近期文章  
       
       
       
   
        
        
        Python网络爬虫与文本数据分析
  
       
       
       
  
       
       
       
   
        
        
        bsite库 | 采集B站视频信息、评论数据
   
        
        
        
  
       
       
       
  
       
       
       
   
        
        
        爬虫实战 | 采集&可视化知乎问题的回答
  
       
       
       
  
       
       
       
   
        
        
        pdf2docx库 | 转文件格式,支持抽取文件中的表格数据
  
       
       
       
  
       
       
       
   
        
        
        rpy2库 | 在jupyter中调用R语言代码
  
       
       
       
  
       
       
       
   
        
        
        tidytext | 耳目一新的R-style文本分析库
  
       
       
       
  
       
       
       
   
        
        
        reticulate包 | 在Rmarkdown中调用Python代码
  
       
       
       
  
       
       
       
   
        
        
        plydata库 | 数据操作管道操作符>>
  
       
       
       
  
       
       
       
   
        
        
        
   
        
        
        plotnine: Python版的ggplot2作图库
   
        
        
        
  
       
       
       
  
       
       
       
   
        
        
        七夕礼物 | 全网最火的钉子绕线图制作教程
   
        
        
        
  
       
       
       
  
       
       
       
   
        
        
        读完本文你就了解什么是文本分析
   
        
        
        
  
       
       
       
  
       
       
       
   
        
        
        文本分析在经管领域中的应用概述  
  
       
       
       
  
       
       
       
   
        
        
        综述:文本分析在市场营销研究中的应用
  
       
       
       
  
       
       
       
   
        
        
        plotnine: Python版的ggplot2作图库
  
       
       
       
  
       
       
       
   
        
        
        小案例: Pandas的apply方法
   
        
        
          
  
       
       
       
  
       
       
       
   
        
        
        stylecloud:简洁易用的词云库
   
        
        
         
  
       
       
       
  
       
       
       
   
        
        
        用Python绘制近20年地方财政收入变迁史视频
   
        
        
          
  
       
       
       
  
       
       
       
   
        
        
        Wow~70G上市公司定期报告数据集
  
       
       
       
  
       
       
       
   
        
        
        漂亮~pandas可以无缝衔接Bokeh  
  
       
       
       
  
       
       
       
   
        
        
        YelpDaset: 酒店管理类数据集10+G  
  
       
       
       
  
       
       
       
   
        
        
        
  
       
       
       
 
      
      
      
  
       
       
       
   
        
        
        “
   
        
        
        分享
   
        
        
        ”和“
   
        
        
        在看
   
        
        
        ”是更好的支持!
  
       
       
       
  
       
       
       
 
      
      
      

本文分享自微信公众号 - 大邓和他的Python(DaDengAndHisPython)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SSH 证书登录教程
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
VS Code 的 7 个开源替代品!
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
Docker 入门终极指南:边学边用
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Wesley13 Wesley13
3年前
2020年8月程序员工资统计,平均14401元,下跌势头止住了!
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
GitHub 数据告诉你:最幸福的码农在用什么编程语言?
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这