打包方法步骤
1.代码纠错
首先要确保python脚本中的所有代码没有异常, 其次保证python中的代码在封装成exe后仍能正常执行;(有些代码在python脚本可以执行,但转换成了exe就不行了)
#错误代码示例
os.path.basename(__file__)
#获取当前脚本名称,__file__在python中可以表示当前脚本,但是在exe中就会出错
exit()
#在python中,可以直接使用exit()函数退出脚本,但是exe中不行
#纠正
os.path.basename(sys.executable)
sys.exit(0)
2.统一文件位置
将 python脚本, 图标文件(必须是.ico格式文件), 版权信息文件(txt) 放在同一个文件夹里(以下称这个文件夹为to_exe) ;
最好把依赖的其他文件或者资源也按照python脚本里的引用路径在to_exe文件夹中, 我在实际使用时, 如果不放, 有时候就出错;
3.在to_exe中打开cmd并执行以下命令(附参数详解)
pyinstaller -F --icon=图标文件名称.ico --version-file=版本信息文件名.txt --hiddenimport=导入的库1;库2;库3...库n py脚本名称.py
# 以上图为例:
pyinstaller -F --icon=DEMO_PICTURE.ico --version-file=DEMO_V.txt --hiddenimport=os;json;sys;re;requests DEMO.py
执行之后, 会提示是否成功, 看到sucessfully就成功了,失败的话大概率是代码有错误,;
成功后将在to_exe中会多出来一些文件和文件夹, 需要的exe可执行文件就在dist文件夹中;
会出现一个脚本名称(DEMO).spec格式文件, 这个就是打包模板, 如果打包错了, 下次可以直接修改这个文件(具体修改方式就不说了, 网上有教程), 然后在cmd中用以下指令, 也可以同样完成打包;
pyinstaller 脚本名称(DEMO).spec
4.exe纠错
成功打包后不要急, 先在dist中打开cmd, 然后用cmd启动这个exe文件(直接输入 exe文件名.exe 回车);
这将打印一些信息, 如果exe执行有错误, 可以看到错误原因;
不要直接双击运行exe, 如果有错误会闪退, 看不到原因;
打包指令的参数详解
1.-F
这是指打包单个文件;
ps:个人觉得这个不算是参数, 便于称呼就叫它参数了;
2.--icon=**.ico
打包时赋予exe文件的图标路径,;
但不建议使用过长路径, 把图标和脚本放一个目录里面, 就直接用图标名就行了;
3.--version-file=**.txt
可以赋予打包后的exe文件属性中的详细信息, 比如版本、版权、作者等;
该属性所需要的文本文件有一定的模板格式, 见下文;
4.--hiddenimport=**;**;...;**;**;
看了很多文档, 对这个属性的作用解释都不一样, 个人觉得是向python解释器声明需要隐藏导入的库;
我看过很多别人发的文档, 有的说, 在用pyinstaller打包时, python解释器能自动获取导入了哪些库, 但是不知道为什么, 在我用的时候, 无法自动获取, 需要用这个属性手动声明;
这个属性还有一个好处, 可以显著减小最后生成的exe文件大小, 不用的话, 可能会把一些不需要的库同时打包进了exe文件;
5.补充
以上参数, 开头有' -- '的参数, 没有顺序区分(-F 需不需要考虑顺序我不清楚, 没试过, 但是最好把他放在第一个);
参数和参数之间都用一个空格隔开就行, 不要在等于号两边或者其他奇奇怪怪的地方随便添加空格;
当然, pyinstaller还有很多其他参数, 虽然我没用过, 但我在这里也列举一些好了:
-D 和-F类似, 不过是打包框架形式编写的python程序, 打包指令作用的文件的是程序入口文件;
--key=*** 使用密钥加密打包, 阻碍反编译;
-K(或者 -tk) 部署时包含TCL/TK;
--add-data=** 添加数据文件, 就是把非文本类型文件, 比如图片, 配饰文件或者别的, 一起打包进exe;
-w exe文件启动时不打开命令行窗口;
#还有好多, 我就不写了, 反正我也没用过, 一般-F -w -icon --version-file --hiddenimport就够用了;
版权信息文件模板(注意是txt文件)
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(0, 0, 0, 0), # 文件版本
prodvers=(0, 0, 0, 0),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x4,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1, #类型
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'040904B0',
[StringStruct(u'CompanyName', u'公司名称'),
StringStruct(u'FileDescription', u'这是一个DEMO'), # 文件说明
StringStruct(u'FileVersion', u'0.0.0'), #文件版本
StringStruct(u'InternalName', u'None'),
StringStruct(u'LegalCopyright', u'版权所有,仿冒必究'), #版权声明
StringStruct(u'OriginalFilename', u'DEMO'), #原始文件名
StringStruct(u'ProductName', u'DEMO'), #产品名称
StringStruct(u'ProductVersion', u'0.0.0')]) #产品版本
]),
VarFileInfo([VarStruct(u'Translation', [2052, 1200])]) #语言
]
)
ps:这个模板文件是我以前在别的博主那里看到的, 但我不记得时哪位大佬了, 如果侵权, 请联系我, 我会马上删除;
这里面的东西最后打包结束后会出现在exe属性详细信息里面,如下图(这是我自己做的小程序):
ico图标制作
准备一张.png格式图片(不能太大);
然后使用在线转换工具, 将png图片转换成.ico;
png图标获取推荐使用: 阿里巴巴的图标库iconfont-阿里巴巴矢量图标库
ps:小白过坑, 不喜勿喷.