将python打包为exe可执行文件Pyinstaller工具

9次阅读

共计 2104 个字符,预计需要花费 6 分钟才能阅读完成。

python 是脚本语言,如果你在开发机器上执行当然会很方便,可是如果你帮他人写了个脚本,想在他人机器上运行,可能会遇到点困难。

为了让脚本在他人机器上顺利执行,你首先要帮他安装 python 解释器,如果你 import 了一些库比如 pandas,那这个也需要安装,甚至相关的依赖也需要安装。这个时间成本显然是很大的,这部分工作也很枯燥,甚至会影响工作积极性,因此花一点时间,学会如何将 python 脚本打包为.exe 文件,无需再安装各种开发环境和依赖库,是一件一劳永逸的事情。

现在,主流的工具有 Pyinstaller、cz_Freeze、py2exe,本文只介绍 Pyinstaller 的使用。


准备工作

  1. 开发环境和工具:

    • python 3.7
    • Pyinstaller 3.4
    • windows 10

Pyinstaller 可以支持 Python 2.7 和 3.4—3.7。*

  1. 要打包的文件 myscript.py 源码:
import pandas as pd

df = pd.read_excel('D:/account.xls')
result = dr.dropna()
result.to_excel('D:/result.xls')

该源码包含 pandas, xlrd, xlwt 等库

  1. 在 windows 上安装 Pyinstaller
  • 根据 Pyinstaller 官方表述,在 windows 上安装 Pyinstaller 需要先安装 pywin32 或 pypiwin32, 否则待会儿转换时,会提示无法找到 win32com 模块的错误,虽然报错缺 win32com,但你要清楚缺的其实是 pywin32 或 pypiwin32。
  • 先用下面 pip 命令查看自己是否已安装该模块:
pip list
  • 如果没有找到,在 pywin32 下载地址下载对应版本的 pywin32,或者直接用下面命令安装 pypiwin32:
pip install pypiwin32
  • 最后安装 Pyinstaller:
pip install pyinstaller

开始打包

  • 可以使用下面命令打包
pyinstaller myscript.py

该命令执行后, pyinstaller 会分析 myscript.py 文件,并且在脚本 script.py 所在文件夹中:

  • 生成 myscripy.spec
  • 创建文件夹 build
  • 在 build 文件夹中生成日志文件和运行所需文件
  • 创建 dist 文件夹
  • 在 dist 文件夹中创建可执行文件夹 myscript,在 myscript 文件夹中,就可以找到 myscript.exe 可执行文件
  • 上面命令生成了很多依赖文件,如果想打包为独立单一的.exe 文件,使用 - F 参数
pyinstaller -F myscript.py
  • 默认生成的执行文件执行时,会弹出一个命令行的窗口,如果不需要弹出,可以再加个 - w 参数
pyinstaller -F -w myscript.py

遇到的问题

打包过程中难免会遇到问题,一般都会遇到缺少模块的问题,比如,在对 myscript.py 打包时会报错ModuleNotFoundError,缺少 xlrd, xlwt 等模块,一般来说可以按照下面三个步骤进行解决:

  1. Pyinstalled 会从本地的环境路径下找需要的模块,例如 python 的包都放在 site-packages 目录下,因此,Pyinstalled 可以直接从该目录下获取需要的模块。如果本地也缺少该模块,先通过 pip 命令安装。例如:
pip install xlrd
pip install xlwt
  1. 如果你需要的模块不在 site-packages,而在你指定的目录下,那打包时你可以通过 -P DIR 参数指定,其中 DIR 为你需要的模块路径:
pyinstaller -F -w -p DIR myscript.py

- p 命令允许指定多个模块路径,可以用 : 分隔,或者多次使用这个参数,像这样:pyinstaller -p DIR1:DIR2:DIR3 myscript.pypyinstaller -p DIR1 -p DIR2 -p DIR3 myscripy.py

  1. 有时候并不是找不到模块,而是代码中有些模块是隐含导入的,这样的话就需要指出这些模块,才能正确的打包,可以在命令行打包时使用参数 --hidden-import MODULENAME 指定模块名,或者可以在打包后生成的 myscript.spec 文件中修改,该文件中有个参数hiddenimports=[]

配置为:

hiddenimports=['cython','sklearn','sklearn.ensemble','sklearn.tree._utils','scipy._lib.messagestream'] 

然后再运行以下命令

pyinstaller myscript.spec

到此本片文章结束。

如果遇到什么问题,欢迎大家和我交流。如有不对之处,还望指正。

参考:

  1. https://pyinstaller.readthedo…
  2. https://blog.csdn.net/windows…
  3. https://zhuanlan.zhihu.com/p/…
  4. https://zhuanlan.zhihu.com/p/…
  5. https://www.jianshu.com/p/95c…
正文完
 0