PyInstaller打包python脚本
因为写了一个小工具,自动生成需求统计的内容,但是同事又不可能在电脑上也装上python以及相关的包依赖(别人一看就觉得太麻烦而且太冗余),于是就想着将写好的python脚本打包成exe,直接双击使用,方便快捷。
说干就干,先是花点时间写完了脚本;然后搜索了相关的关键词,找到了py2exe、PyInstaller、cx_Freeze等工具,最后确定使用PyInstaller。
使用PyInstaller有几个原因:
- PyInstaller现在仍然在更新
- PyInstaller使用方法简单,py2exe比较繁琐
- PyInstaller网上教程比较多
安装PyInstaller
推荐使用pip安装
pip install pyinstaller
安装完后,直接输入pyinstaller
usage: pyinstaller-script.py [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[-p DIR] [--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS]
[--exclude-module EXCLUDES] [--key KEY] [-d] [-s]
[--noupx] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>]
[-r RESOURCE] [--uac-admin] [--uac-uiaccess]
[--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean]
[--log-level LEVEL] [--upx UPX]
scriptname [scriptname ...]
pyinstaller-script.py: error: the following arguments are required: scriptname
可以看到PyInstaller的信息,说明安装完成,可以使用了;详细帮助可以pyinstaller -h
查看。
使用PyInstaller
PyInstaller的使用非常简单:
# 打包成一个文件
pyinstaller -F test.py
# 打包成文件夹(默认)
pyinstaller test.py
#打包成一个exe,关闭命令,指定新文件名
pyinstaller -F -w D:\autoProject\testcase\main.py -n 测试报告生成器
因为要精简到底,所以我选择打包成一个文件。
先cd到pyinstaller的安装文件夹,然后输入命令 pyinstaller -F 要打包的文件的路径地址,如下
执行完之后,看下下面的日志,说明打包成功
打包完成后,打开dist
文件夹,里面的那个exe文件就是打包好的程序,运行测试一下是否打包成功。
PyInstaller选项说明
-D, --one-dir
打包成一个文件夹,默认-F, --one-file
打包成一个exe文件-p DIR, --paths DIR
添加路径,一般用来添加程序所用到的包的所在位置-c, --console, --nowindowed
提供程序视窗,程序有输入输出的界面,默认-w, --windowed, --noconsole
无视窗,程序后台运行-i <FILE.ico or FILE.exe,ID or FILE.icns>, --icon <FILE.ico or FILE.exe,ID or FILE.icns>
添加icon图标-
打包过程遇到的问题
1、AttributeError: module 'enum' has no attribute 'IntFlag'
原因:
This is likely caused by the package enum34. Since python 3.4 there's a standard library enum module, so you should uninstall enum34, which is no longer compatible with the enum in the standard library since enum.IntFlag was added in python 3.6.
这可能是由包Enum34引起的。因为Python3.4有一个标准库枚举模块,所以您应该卸载Enum34,因为在Python3.6中添加了Enum.Intflag,所以它不再与标准库中的枚举兼容。
解决:pip uninstall enum34 #卸载enum34