目录
-
工具准备
工具名 版本号
PyInstaller 4.0.dev0+3e6f7dc709
setuptools 41.0.1
Setup Factory 7.0
前两个工具为Python的包,可以直接通过以下命令直接安装:
pip install pyinstaller==4.0.dev0+3e6f7dc709
pip install setuptools==41.0.1
Ps: 强烈建议下载最新版本的Pyinstaller,因为这个包在打包Python项目为exe文件时经常出现各种各样的问题,使用最新版本的包可减少打包出错率。
Pyinstaller最新版本号查询链接: https://pyinstaller.readthedocs.io/en/latest/index.html
最后一个Setup Factory 则是一个需要单独下载安装Windows软件,参考下载连接如下:
https://www.jb51.net/softs/727720.html
-
打包Python项目(setuptools)
假设你有一个已经完成的Python项目,现在你要把它打包成exe程序,你首先要做的一件事情是先把它打包成一个python能识别并导入的包,就像那些你能直接import并使用的其他普通的python包一样,这么做的目的是为了在下一步使用Pyinstaller打包你的python项目时让它能够自动识别出你自己定义的一些包,否则将会导致你打包好的软件无法运行,提示No module named XXX的错误。
使用以下代码即可轻松将你的自定义python项目打包成可import的python包
# -*- coding:utf-8 -*-
from setuptools import setup,find_packages
setup(
name= "packageName", #你的python项目包名
version = '1.0.0',
description='No description',
author="daimashiren",
author_email='123456@gmail.com',
url='xxx.com',
packages = find_packages(),#find_packages()方法会自动寻找当前目录下名为packageName的包
)
将以上代码保存为setup.py文件,并保存在你的python项目包的相同目录下。随后打开cmd命令行窗口,cd命令进入该项目目录地址,使用如下命令进行python项目的打包:
python setup.py install
打包完成应该会出现以下几个文件夹:
只有dist文件夹中的东西是我们需要的,打开后里面是一个python的egg文件,其实就是一种类似zip的压缩文件,理论上setuptools会帮我们自动把这个文件复制到你的python安装目录C:\Program Files\Python\Lib\site-packages中,不过还是需要你自己打开验证一下:
另外还得再检查下easy_install.pth文件中有没有你的项目包名,pth后缀的文件记录的是python导入包时会检索的路径或包名,如果你的项目包名不在该文件里则需要自己加上,否则你自定义的Python包还是无法被正常Import
完成以上步骤后,可以在桌面打开cmd命令行输入以下命令尝试导入你的自定义包,看看能否成功被导入,如果,没有报说明No module named XXX 错误则说明python项目打包成功,否则则需要重新尝试以上步骤,重新打包直到能够导入为止。下图中自定义的"courseHelper_dev"包导入成功而自定义的"packageName"包则导入失败!
打包为exe文件(Pyinstaller)
假设你上一步已经成功完成了将自己的python项目打包成可以成功被import的python包,那么接下来这一步就显得要轻松得多,只需要一行命令即可轻松将你的python项目打包成exe文件。首先准备一下如下文件:
Main.py为程序的入口主文件,myapp.ico文件则用于exe文件的图标(默认的exe文件图标实在太丑了。。。),这里推荐一个程序图标制作网站,可以选一张自己喜欢的图片做程序图标。程序图标制作网址→http://www.bitbug.net/
打开cmd命令行窗口进入当前目录,使用如下命令进行exe文件的打包:
pyinstaller Main.py -D -c -i myapp.ico
参数解释:
参数名 | 解释 |
-D | 将项目打包成一个文件夹,里面包含exe文件及其依赖文件(推荐) |
-F | 将项目打包成一个单独的exe文件,软件会在运行的时候自动解压到一个临时目录,启动速度较慢,软件的运行目录不好掌握,软件运行结束后将创建的临时目录删除。(不推荐) |
-c | 软件运行时自带一个命令行窗口,可用于监测软件运行过程。(初次打包推荐) |
-w | 软件运行时无命令行窗口,更简洁美观,但软件出错时没有提示(初次打包不推荐) |
-i | 为目标软件适配一个新的软件的图标,后接图标地址,仅支持.ico文件 |
更多参数解释请参考官网教程https://pyinstaller.readthedocs.io/en/stable/usage.html
等待打包完成后,同样出现以下文件夹,其中只有dist文件夹中有我们需要的文件
使用Pyinstaller打包应用程序往往不会一次就成功,因为它并不能识别所有的依赖关系,往往导致打包好后的软件提示如下错误而打不开:
导致打包好后无法正常打开的原因主要有以下两点:
- 代码本身存在问题
- 软件缺失某特定的依赖
首先针对问题1,代码本身存在问题的原因可能是多种多样的,但是最致命的一点就是路径问题,尤其是你的项目需要获取外部资源文件时,路径问题不处理好,软件是不可能正常运行的。因为软件打包成exe的运行方式和你在开发工具中运行py文件时获取路径的方式是完全不一样的,这也是为什么前面不建议直接将你的软件打包成一个单独的exe文件,因为你将很难去确定它到底会在你电脑上的哪一个位置去解压这些文件,最好的解决办法是写一个路径处理代码,分别应对在开发工具中调试和打包成exe文件时不同的路径处理方法,可以参考如下代码:
def get_app_path():
if getattr(sys, 'frozen', False):
# we are running in a bundle
bundle_dir = sys._MEIPASS
return bundle_dir
else:
# we are running in a normal Python environment
bundle_dir = os.pardir
return bundle_dir
Pyinstaller在将你的项目打包成exe文件后,会把你的exe文件运行的路径目录存储在sys._MEIPASS变量中,正确处理路径问题能在很大程度上减少打包失败率。
更多有关Pyinstaller的文件运行路径问题可参考此链接:https://pyinstaller.readthedocs.io/en/stable/runtime-information.html
路径问题处理好了,一般问题1也就解决了,接下来解决问题2,依赖缺失问题。上面的软件运行的时候只是提示了"Failed to execute script XXX"的错误,这是因为我在打包的时候使用的是"-w"命令即无命令行窗口的指令,要想获取更详细的软件运行信息还是需要在打包的时候使用"-c"命令,即可在命令行窗口中查看到具体的错误信息。但实践之后发现即使用了"-c"命令来打包,软件出错时的命令行窗口也只是一闪而过,甚至没有半秒让人解读bug的机会,实在是
经过一番探索,发现只要使用如下代码即可捕捉到详细的错误信息,代码如下:
import cgitb
cgitb.enable(format="text")
import os
result=os.popen(r".\Updater.exe") #填你的exe文件名
print(result.read())
将以上代码保存为check_app.py文件保存在你的exe文件相同目录下,打开cmd命令行窗口,使用如下代码运行文件
python check_app.py
即可在命令行窗口中打印出具体的错误信息,看看你缺少的依赖是啥,补充相应缺失的文件到当前exe所在目录中即可。
解决以上两个问题应该大概率就能解决你打包好后的软件无法运行的问题了,如果还是不行,那我劝兄弟你还是放弃Pyinstaller吧,还有其他的python打包工具可以尝试,不要吊死在一棵树上啊。
-
封装成可安装和卸载的软件(Setup Factory)
有时候做项目别人会要求你制作一个可以完整安装和卸载的程序,如果仅仅只是给别人一个含有exe文件的文件夹,那实在是太不优雅了,所以就有人创造了这个优雅的工具来完成这件优雅的事情。工具的下载链接在这里→https://www.jb51.net/softs/727720.html
以下为工具的使用教程
等待打包完成即可。
码字不易,点个免费的赞再走吧~
感谢阅读
希望对您有帮助!