Python脚本打包为可执行程序 资料教程 Python


本教程演示环境

  • Python版本:Python 3.7.3

  • 系统环境:Windows10 1809

  • pip版本:19.03

  • 提前将Python添加到系统环境变量

Python的本质

Python是一个脚本语言,被解释器解释执行,它的发布方式:

  • .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的)

  • .pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。

  • 可执行文件:对于非码农用户或者一些小白用户,你让他装个Python同时还要折腾一堆依赖库,那简直是个灾难。对于此类用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉Ta即可。比较麻烦的是需要针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,...)。【这就是为什么要打包位exe的原因】

本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstaller,其它仅作比较和参考


安装pyinstaller

(本教程安装方式为pip安装)

  1. pip安装

    对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定:

    pip3 install pyinstaller
  2. 源码安装
    下载pyinstaller源码包,然后进入包目录,执行下面的命令(需要安装setuptools

    python setup.py install
  3. 检测安装正确性
    安装完成以后,输入如下指令检测pyinstaller安装正确性

    pyinstaller --version

使用PyInstaller

  • pyinstaller的语法:

    pyinstaller [options] script [script ...] | specfile
  • PyInstaller 支持的常用参数

    不管这个 Python 应用是单文件的应用,还是多文件的应用,只要在使用 pyinstaller 命令时编译作为程序入口的 Python 程序即可。

    PyInstaller工具是跨平台的,它既可以在 Windows平台上使用,也可以在 Mac OS X 平台上运行。在不同的平台上使用 PyInstaller 工具的方法是一样的,它们支持的选项也是一样的。

    -h,--help查看该模块的帮助信息
    -F,-onefile产生单个的可执行文件
    -D,--onedir产生一个目录(包含多个文件)作为可执行程序
    -a,--ascii不包含 Unicode 字符集支持
    -d,--debug产生 debug 版本的可执行文件
    -w,--windowed,--noconsolc指定程序运行时不显示命令行窗口(仅对 Windows 有效)
    -c,--nowindowed,--console指定使用命令行窗口运行程序(仅对 Windows 有效)
    -o DIR,--out=DIR指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
    -p DIR,--path=DIR设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
    -n NAME,--name=NAME指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

pyinstaller使用教程实例

  1. 打包无GUI程序为可执行文件
    首先,我们创建一个Python脚本文件(此处命名为demo.py),写入如下代码
    '''
    @theme:pyinstaller使用实例教程
    @author:夜琉璃
    '''
    
    def say_hello(name):
        print('hello,',name)
        
    say_hello('yeliulee')
    然后切换到源代码文件所在的目录,执行如下代码
    pyinstaller demo.py

    然后会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,对于上面的命令你会发现dist目录下面有一堆文件,各种都动态库文件和demo.py编译后的可执行文件。

    有时这样感觉比较麻烦,需要打包dist下面的所有东西才能发布,万一丢掉一个动态库就无法运行了,好在pyInstaller支持单文件模式,只需要执行如下指令即可:

    pyinstaller -F demo.py

    执行完以后就发现,就生成了一个exe单文件啦,但是会发现比较大(我这是5.84M),这是因为里面包含了解释器和一堆动态库

    运行结果

  2. 打包GUI程序
    创建一个app.py文件,写入如下代码(此处GUI使用的是Python内置的tkinter)

    '''
    @theme:pyinstaller使用实例教程
    @author:夜琉璃
    '''
     
    from tkinter import Tk
    app = Tk() # 初始化Tk()
    
    if __name__ == '__main__':
        app.mainloop()

    由于GUI程序其实不需要显示命令行窗口,所以我们需要加一个"-w"参数,隐藏命令行窗口,执行如下指令进行打包

    pyinstaller -F -w app.py

    生成文件以后执行结果(由于只是产生一个空的默认窗口,所以什么都没有)


PyInstaller的原理简介

  • PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装python和你的脚本依赖的库。在Linux操作系统下,它主要用的binutil工具包里面的ldd和objdump命令。

  • PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。

  • 可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。

  • 需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样或类似的环境下。也就是说,可移植性不大,若需要在不同系统上运行,就必须针对该平台进行打包。

签名:上善若水,水善利万物而不争。
最新回复 (2)
  • 囧rz 2019-05-05 22:51:45
    2

    我冒险过来,你们应该不会揍我吧

    最后于 2019-05-07 22:23:00 被夜琉璃编辑 ,原因:
    签名:这个人很懒,什么也没有留下!
  • 夜琉璃 2019-05-05 22:57:55
    3
    囧rz 我冒险过来,你们应该不会揍我吧
    放心,我们都不是好人
    签名:上善若水,水善利万物而不争。
    • 代码信条-CodeCreed
      4
        立即登录 立即注册 QQ登录
返回
首页
开发
源码
运维
我的