#打包目的:完全脱离环境,只copy hello.exe去其他机器就可以完美运行
#打包命令:
pyinstaller --onefile .\xxx\hello.py --hidden-import "tkinter" --hidden-import=glob --hidden-import=lxml --add-data ".\xxx\*;." --distpath output_dir --add-data c:\h1.exe;.
--onefile:以hello.py为入口文件,将整个程序打包为一个hello.exe文件
--hidden-import:打包时手动把需要的library打包进去
--add-data ".\xxx\*;.":打包时将xxx folder下的所有文件打包到exe的根目录下
--distpath output:生成.exe的路径
问题1:
cmd = sys.executable + " example.py" #调用执行程序的python脚本去执行example.py
如果py脚本里有sys.executable调用当前python去执行其他python脚本,sys.executable在python脚本是执行脚本的当前python, 而打包后的sys.executable则是h1.exe,所以会调用hello.exe执行.py,这样就会报错
解决方法:
将调用的.py脚本再次打包成为h1.exe,然后再在.py脚本里用c:\xxx\h1.exe代替sys.executable .py,这样就可以完全脱离python依赖
这样在当前电脑可以运行,但如果换个电脑不把h1.exe放到指定路径就会提示找不到h1.exe
问题2:
换电脑执行hello.exe提示找不到h1.exe,因为只把hello.exe单独copy过去执行,h1.exe没有copy,我们期望的是只把hello.exe copy过去就行,不需要copy其他依赖文件
解决方法:
#在相关.py脚本里定义这个函数,然后调用它获取真实的文件路径
#sys._MEIPASS这个属性只有在python脚本被打包成h1.exe后执行exe才会有值,这个路径如下所示
#sys._MEIPASS: C:\Users\ADMI\AppData\Local\Temp\_MEI12346
#执行hello.exe后会在该路径下解压相关文件,你可以看到你打包的文件布局
import sys
def resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)\n