5-01 Python 项目移植-Windows 执行文件

当使用者完成一个 Python 项目的时后,要将这个代码移交给他人可能会遇到的问题有以下三种情况:

  • Python 解释器:有无安装或版本不同。
  • 相关包: 代码中有需要使用的包。
  • 操作系统: Windows, Mac OS, Linux等不同操作环境。

如果对方是一般使用者连编程都不会的使用者,那肯定是不会安装 Python 解释器的,所以对这样的用户而言,要递送一个 Python 开发的项目,肯定是有困难的,所以最好的方法就是将 Python 代码打包成 Windows 可以直接运行的执行文件 (.exe)。目前可以完成这样工作的包整理如下:

方案WindowsLinuxOS XPython 3版权一个文档最新版本日期
bbFreezeyesyesyesnoMITno2014-01-20
py2exeyesnonoyesMITyes2020-11-08
pyInstalleryesyesyesyesGPLyes2020-11-18
cx_FreezeyesyesyesyesPSFno2020-11-26
py2appnonoyesyesMITno2020-09-16

安装 pyinstaller

以下会以 pyInstaller 为例来说明,首先安装 pyinstaller 包

pip install --user pyinstaller
pip show pyinstaller 
  
# 显示 pyinstaller 包的结果
Name: pyinstaller
Version: 4.1
Summary: PyInstaller bundles a Python application and all its dependencies into a single package.
Home-page: http://www.pyinstaller.org/
Author: Hartmut Goebel, Giovanni Bajo, David Vierra, David Cortesi, Martin Zibricky
Author-email: None
License: GPLv2-or-later with a special exception which allows to use PyInstaller to build and distribute non-free programs (including commercial ones)
Location: c:\users\user\appdata\roaming\python\python37\site-packages
Requires: pyinstaller-hooks-contrib, altgraph, pywin32-ctypes, pefile, setuptools
Required-by:

系统会自动安装与 pyinstaller 相依的包,如 pyinstaller-hooks-contrib, altgraph, pywin32-ctypes, pefile, setuptools 等,安装完毕后,可以用 pip show 观察一下安装的相关信息,因为等一下需要直接调用 pyinstaller 的执行文档,

建立 python 文档

以第 4 章的实例来进行练习,因为需要显示图形界面,所以需要先安装 PyQt 包,说明一下 matplotlib 在进行绘图时会有许多不同的用例和输出格式,从 python shell 交互式使用matplotlib,并在键入命令时弹出绘图窗口;将 matplotlib 嵌入到图形用户界面 (如 wxpython 或 pygtk ) 中来构建丰富的应用程序;透过批处理脚本中使用 matplotlib 从一些数值模拟中生成 postscript 图像;在 web 应用程序服务器中动态提供图形。

为了支持所有这些用例, matplotlib 可以针对不同的需求,产生不同的输出,每个功能都被称为后端 (backend),前端是用户面对的代码,也就是绘图代码,而后端则在幕后完成绘制图形的所有艰苦工作。有两种类型的后端:用户界面后端 (用于 pygtk, wxpython, tkinter, qt4 或 macosx 中,也称为交互后端 (interactive backends)) 和硬拷贝后端 (hardcopy backends)以制作图像文件 (PNG, SVG, PDF, PS,也称为非交互后端 (non-interactive backends))。配置后端有四种方法,以下实例用的是最后一种方法,直接在代码中调用 use() 方法,这方法将覆盖其他的设置。

plot2exe.py

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import PyQt5
matplotlib.use('Qt5Agg')
  
# 创建一个 figure 对象,相当于一个空白的画布
figure = plt.figure()
  
# 在画布上添加一个坐标系,画布内有 2 x 1 个子图,回传第一个子图
axes1 = figure.add_subplot(2, 1, 1)
  
# 准备画图的数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [21, 27, 29, 32, 29, 28, 35]
  
# 设置画布的基本元素
axes1.set_xlabel('x label')
axes1.set_ylabel('y label')
axes1.set_title("title")
  
# 画图
axes1.plot(x, y)
plt.show()

建立 python 文档

下表为 pyinstaller 常用选项介绍

选项说明
-h, --help来查看参数
–clean清理 PyInstaller 缓存并删除临时文件。
-n NAME, --name NAME指定建立的执行文档名称
-i , --icon 图标路径建立图标
-w, --windowed, --noconsole使用窗口,无控制台
-c, --console, --nowindowed使用控制台,无窗口
-F, --onefile打包成一个 exe 文件

pyinstaller 安装在 c:\users\user\appdata\roaming\python\python37\site-packages,相对应的执行文档会放在上层的 Scripts 文件夹中,指定相对应的文件夹后,运行 pyinstaller 指定要运行的 python 文档,因为是画出一个折线图,所以指定 w 选项指定使用窗口,无控制台

C:\Users\user\AppData\Roaming\Python\Python37\Scripts\pyinstaller.exe -F plot2Exe.py -w

在这里插入图片描述

图 5-1 建立一个 Python 的执行文档

运行 python 执行文档(exe)

使用 tree 命令,观察 pyinstaller 建置执行文档时,所产生的相关文档

  • 目前文件夹建立一个 plot2Exe.spec 文档
  • 建立 build 文件夹:建立 log 纪录文件与工作档案。
  • 建立 dist 文件夹:建立执行档(.exe)
  • 建立 __pycache__文件夹:放编译时需要的档案用的档案。当你在 python 中运行程序时,解释器首先将其编译为字节码,并将其存储在 __pycache__ 文件夹中。
D:\plot2exe>tree/F
D:.
│  plot2Exe.py
│  plot2Exe.spec
│
├─build
│  └─plot2Exe
│          Analysis-00.toc
│          base_library.zip
│          EXE-00.toc
│          PKG-00.pkg
│          PKG-00.toc
│          plot2Exe.exe.manifest
│          PYZ-00.pyz
│          PYZ-00.toc
│          warn-plot2Exe.txt
│          xref-plot2Exe.html
│
├─dist
│      plot2Exe.exe
│
└─__pycache__
        plot2Exe.cpython-37.pyc

在这里插入图片描述

图 5-2 运行 Python 的执行文档

无相关包

第二种情况就是 Python 文档中会导入所需要的包,所以直接给对方 Python 代码也不能运行,会出现没有相关包的错误信息,如 ModuleNotFoundError: No module named ‘xyz’ 这样的信息,所以我们需要收集开发项目所需要的包信息,常见的建议是用 pip freeze 这个命令用于生成当前 Python 环境下所有类库包列表生成 requirements.txt 文件,其它包括那些没有在当前项目中使用的类库包

D:\plot2exe>pip freeze > requirements.txt
  
D:\plot2exe>more requirements.txt
altgraph==0.17
backcall==0.2.0
brewer2mpl==1.4.1
certifi==2020.11.8
chardet==3.0.4
colorama==0.4.4
cycler==0.10.0
decorator==4.4.2
docopt==0.6.2
et-xmlfile==1.0.1
future==0.18.2
gdcm==1.0
idna==2.10
imageio==2.9.0
ipykernel==5.3.4
ipython==7.19.0
ipython-genutils==0.2.0
jdcal==1.4.1
jedi==0.17.2
jupyter-client==6.1.7
jupyter-core==4.6.3
kiwisolver==1.3.1
matplotlib==3.3.3
networkx==2.5
numpy==1.19.3
opencv-python @ file:///D:/czcit/opencv_python-4.4.0.44-cp37-cp37m-win_amd64.whl
openpyxl==3.0.5
pandas==1.1.4
parso==0.7.1
-- More (47%) --

可以发现这种方法会安装很多不必要的有类库包,建议使用 Python 所提供的 pipreqs 这个包,它可以收集指定文件夹下的 Python 文件中所导入的类库包,针对这些包来建立 requirements.txt,可以发现我门的范例只需要 3 个类库包。

D:\plot2exe>pip install --user pipreqs
D:\plot2exe>pipreqs --encoding UTF8 .
D:\plot2exe>more requirements.txt
matplotlib==3.3.3
numpy==1.19.3
PyQt5==5.15.2

有了这份文档,就可以把这份文档 requirements.txt 跟 Python 代码文档 plot2Exe.py 交给使用者,对方只需输入以下命令,就可以直接用运行了。

pip install -r requirements.txt
python plot2Exe.py

以上提供了简单的方式来解决项目递交的方法,但项目开发过程繁杂,还是需要有更妥善的机制来进行管理,接着将探讨如何在 Python 中建立虚拟环境,在应用程式层级建立虚拟环境,以及如何在云端建立虚拟环境。

Python数据处理-文章目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值