pyinstaller打包整个文件文件夹和相关exe,三方库

#打包目的:完全脱离环境,只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

 





 

posted @ 2025-09-15 09:42  我的腹肌不见了  阅读(76)  评论(0)    收藏  举报