打包方法步骤

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文件夹中, 我在实际使用时, 如果不放, 有时候就出错;

python脚本执行完却不退出是什么原因_python

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属性详细信息里面,如下图(这是我自己做的小程序):

 

python脚本执行完却不退出是什么原因_python_02

ico图标制作

准备一张.png格式图片(不能太大);

然后使用在线转换工具, 将png图片转换成.ico;