最详细的Python打包工具:Pyinstaller实战指南,如丝滑般体验

写了个吊炸天的Python项目,把我和左手相处的时间都赔上了。但出于版权考虑,我不太想让使用方直接用我的代码,毕竟Python代码给出去,就真的收不回来了。

想给客户演示的时候,不想那么墨迹的打开dos cmd 或者 terminal ,然后运行 python app.py 这样的命令行。最好是客户双击,完事儿。就像有人在那自己动一样……

PyInstaller 来了,他就是这么一款帮助我们把整个项目完整打包的工具。目前已经兼容Py3.7,以及 Mac App 和 Windows Exe。

文档:https://pyinstaller.readthedo...

先说下,这篇文章有别于网上那坨安装、打包的草包,这次是真核!

1. 安装

这个很简单,直接 pip install pyinstaller 就好。

??注意了:你要编译成exe,建议你省心点的在windows上用pyinstaller,如果你要mac app的,那就用mac编译。

我今天就以windows为例

2. 简单使用

这个也很简单,网上一抓一大把,我这里就不赘述了,无非就是那么几个命令:

pyinstaller -F 项目主文件(或者是单一脚本)

3. 参数说明

-F,打包所有的依赖包在一个exe中,包括你自己的模块、内置模块以及第三方模块。

-c,如果你是命令行窗口,就要加上这个参数。

-w,窗口程序,比如你用了PyQt。

4. 高级用法:配置文件

.spec,这个文件非常重要,我们可以通过编辑这个文件来打包我们的项目,类似DockerFile。

我给大家贴一个我的:

# -*- mode: python -*-

block_cipher = None

a = Analysis([‘C:\\app\\main.py‘],
            pathex=[‘C:\\‘],
            binaries=[],
            datas=[
                (‘C:\\data\\input\\builtin\\*.xlsx‘, ‘.\\data\\input\\builtin\\‘),
                (‘C:\\data\\input\\*.xlsx‘, ‘.\\data\\input\\‘),
                (‘C:\\data\\output\\‘, ‘.\\data\\output\\‘),
                (‘C:\\log\\‘, ‘.\\log\\‘),
                (‘C:\\app\\db\\‘, ‘.\\app\\db\\‘)
            ],
            hiddenimports=[‘numpy‘, ‘pandas‘],
            ...
            )

pyz = PYZ(a.pure, a.zipped_data,
            cipher=block_cipher)

exe = EXE(pyz,
         ...
         )

这其实就是一个python文件,只不过后缀是spec罢了。

.spec一共会有4个对象,分别是:Analysis、PYZ、EXE、COLLECT。

Analysis用处最多,一个个解释:

  • 第一个参数,是指定我们整个项目的主程序,也就是我们的入口文件。
  • pathex,就是我们的工作目录
  • datas,存放我们的数据。

好了,说到这里就要好好说一说这个Pyinstaller的工作流程了。当我们双击编译好的exe后,他是会创建一个临时目录,把所有需要用的包都解压到那里,然后执行。执行完毕后,临时文件夹就消失了。

这和我们有什么关系呢?想一下,如果你的项目中需要去读取某些文件,甚至是用户的输入参数,怎么办?打包出来的exe 是没有办法通过直接指定参数,类似:python main.py --input=*.xlsx 来读取文件的,因为我之前说了,在执行的时候会把项目解压到一个临时目录,所以原来项目中写好的相对路径也不管用。

为此,我们需要把host上的实际文件给copy到那个临时目录下,所以这个datas的作用就是这个,我的文件中,我把host下的 C:\data\input\builtin*.xlsx文件都copy到临时目录的 data\input\builtin 下面。

hiddenimports ,继续说下去,PyInstaller有时候无法侦察到全部的依赖包,怎么办?我们可以在这个后面加,把PyInstaller编译出来的exe在运行的时候报的缺少模块给写里面。

??注意了: pandas 和 numpy 有个很奇怪的地方,就是引用了 pandas 的地方,如果没有引用 numpy ,就会报错。所以你可以在主入口上面加一个 import numpy 。

??注意了:直接 import numpy 还是会报错。怎么办?在 import numpy 下面加 import numpy.core._dtype_ctypes

5. 临时目录

那刚刚说的临时目录在代码里怎么处理呢,如果代码中还是老样子处理相对路径,一定是找不到的。

官方文档中给出了这么一段:

Your app should run in a bundle exactly as it does when run from source. However, you may need to learn at run-time whether the app is running from source, or is “frozen” (bundled).

import sys
if getattr( sys, ‘frozen‘, False ) :
      # running in a bundle
      basedir = sys._MEIPASS
else :
      # running live

所以在你的项目中,如果有配置文件的话,就在那里加上这一段,然后在bundle中添加你的新路径,else还是你的老代码。

这个 sys._MEIPASS 是个特殊的值,是在Pyinstaller打包的时候才会添加的临时变量,通过这个变量我们可以获取到在执行exe时候的临时目录。

这对代码的改动是最小的。

6. 编译打包

最后,我们执行 python xxx.spec 就好了。打包的可执行文件会在dist里,build中是一些打包时候需要的文件。

输出中最后有 successfully 字样,就算成功了。他也会告诉你,exe出现在哪个位置。

当然不是说这样就万无一失了,别人也可以反编译你的exe,所以我们可以在打包的时候用Cython去编译一次,把混淆过的代码打包。这样的话难度就增加了,同时再加上mac地址绑定,这里就有多种思路了。

相信大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每日分享一些学习的方法和需要注意的小细节

走进:python技术分享交流

原文地址:https://blog.51cto.com/14318113/2392585

时间: 2024-10-02 05:53:47

最详细的Python打包工具:Pyinstaller实战指南,如丝滑般体验的相关文章

[转]Python打包工具

作者:Tarek Ziadé,翻译:张吉 原文:http://www.aosabook.org/en/packaging.html 转载地址:http://www.ituring.com.cn/article/19090 14.1 简介 对于如何安装软件,目前有两种思想流派.第一种是说软件应该自给自足,不依赖于其它任何部件,这点在Windows和Mac OS X系统中很流行.这种方式简化了软件的管理:每个软件都有自己独立的“领域”,安装和卸载它们不会对操作系统产生影响.如果软件依赖一项不常见的类

Python打包工具setuptools的使用

将我们写的Python程序发布成包后,可以使其能够安装使用. 在项目上测试的时候,某些情况下,可以将Python打包,然后上传到测试服务器,安装测试. setuptools是常用的打包工具. 一个简单的setup.py文件如下: from setuptools import setup, find_packages setup( name = "my_demo", version = "0.1", packages = find_packages() ) 其中,na

python打包工具distutils、setuptools分析

在上一篇博文中总结了python中导入包,安装包一条完整的线路.其中有一个有意思的知识点,安装包的方式有很多种,模块和包管理中打包,发布,安装也是值得研究的内容. python中安装包的方式有很多种: 源码包:python setup.py install 在线安装:pip install 包名(linux) / easy_install 包名(window) python包在开发中十分常见,一般的使用套路是所有的功能做一个python模块包,打包模块,然后发布,安装使用.打包和安装包就是最常见

Python打包方法——Pyinstaller (python3)

  一.安装Pyinstaller 使用pip命令安装:pip install PyInstaller 二.使用Pyinstaller 1.使用下载安装的方式安装的Pyinstaller打包方式 将需要打包的文件放在解压得到的Pyinstaller文件夹中,打开cmd窗口,把路径切换到当前路径打开命令提示行,输入以下内容(最后的是文件名): python pyinstaller.py -F myfile.py 2.使用pip方式安装的Pyinstaller打包方式 打开cmd窗口,把路径切换到文

Python 打包工具cx_freeze 问题记录及解决办法

在节前的最后一天,解决了打包过程中遇到的所有问题,可以成功运行了!真是个好彩头,希望新的一年一切顺利! 以下是在使用cx_freeze过程中遇到的问题及解决办法(Win7) 问题描述:运行exe,启动无数个主程序,导致系统无法使用   原因:在程序中使用了multiprocessing的包   解决办法:在主文件if __name__ == "__main__":后,添加multiprocessing.freeze_support(),一定要在添加在最开始处 2. 问题描述:运行后,提

python版本管理工具pyenv和包管理工具pipenv

一.pyenv版本管理工具 pyenv是一个python版本管理工具,可以实现轻松切换多个python版本 它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理virtualenv虚拟环境,可以自己创建virtualenv或者通过pyenv-virtualenv来自动化创建虚拟环境 pyenv通过PATH环境变量来匹配切换python或者pip的工作目录,pyenv通过读取工作环境来指定使用哪个python版本,如在当前会话中查找PYENV_VERSION环

python之模块distutils,打包工具

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块distutils,打包工具 import distutils #distutils包有2个目的: 1)distutils希望让最终用户觉得安装新模块.包和工具的过程一致而轻松 2)distutils希望让新模块.包和工具的开发者觉得创建这些容易安装的分发包很轻松 总得来说,distutils就是用来打包的模块. #2.用distutils如何打包? #http://blog.csdn.

使用pyinstaller 2.1将python打包并添加版本信息和图标

最近用 wxpython写了一个小的脚本,因为想要发布给没有装python和wxpython的人使用,遂决定使用pyinstaller 2.1进行打包. 其中遇到几个问题: 1,给打包的文件添加图标 查看pyinstaller 的操作手册很容易发现: -i <FILE.ico>, -i <FILE.exe,ID>, --icon=<FILE.ico>, --icon=<FILE.exe,ID>   Add an icon to the output exec

Python打包成exe工具

Python是一个应用很广泛的编程语言,当然少不了GUI 在Windows下可以有很多GUI库选择去写图形程序,但写好之后想在其他电脑上运行,必须要有python解释器环境. 解决这个问题就要用打包工具了,把python源码打包成exe之后就可以拷贝到其他电脑上运行了. 目前了解的有下面几种,常用的pyinstaller和cx_freeze: 1.py2exe 官方主页:   http://www.py2exe.org/ 2.pyinstaller 官方主页:   http://www.pyin