欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

py打包exe,遇到的坑

时间:2023-05-15

1、运行exe总是提示某个模块不存在,其实是引用的方法不对

当要打包的exe程序涉及的文件目录很多,目录之间存在比较多的引用关系时,要注意引用的正确性,否则打包后,运行exe时会提示模块不存在

最好要打包的主程序文件放在工程的最外层,这样引用的时候把工程当成根目录,只需要用from...import去引用其他目录的文件,from后跟的是类文件所在的目录层级,import后是类文件名称(目录下要有init文件)。

 

2、获取文件路径时,获取到临时文件路径

 

有些程序包含了数据文件夹,不能直接按资源文件方式打包,需要在执行文件所在的文件夹内创建这些数据文件。一般情况下在脚本中我们可以使用os.path.split(os.path.abspath( __file__))来的到code.py的路径,然后拼接得到数据文件夹。但之后使用pyinstaller -F code.py打包成单个exe文件,在未读取数据文件夹的情况下运行正常,一旦打开数据文件,就会闪退,命令行窗口会显示打不开数据文件。因为PyInstaller会创建临时文件夹temp,程序代码在这个临时文件夹中运行,我们可以用以下几个语句来查看正式运行路径:

import sysimport osprint(sys.path[0])print(sys.argv[0])print(os.path.dirname(os.path.realpath(sys.executable)))print(os.path.dirname(os.path.realpath(sys.argv[0])))print(os.path.split(os.path.realpath(__file__))[0])

打包成exe之后变成: 

 

 

 到的结果是os.path.dirname(os.path.realpath(sys.executable))和os.path.dirname(os.path.realpath(sys.argv[0]))才是含数据文件夹的路径。因此可以按如下方式取得文件路径,然后根据需要拼接得到数据文件夹的真实路径:

if hasattr(sys, '_MEIPASS'):# PyInstaller会创建临时文件夹temp# 并把路径存储在_MEIPASS中 self.appPath = os.path.dirname(os.path.realpath(sys.executable))else: self.appPath, filename = os.path.split(os.path.abspath( __file__))

3、其他可能的坑:你的项目所需要的第三方库确实多,递归深度也确实深。

解决办法:打包不成功也会生成一个xxx.spec文件,打开xxx.spec文件,将下面两行代码放在第二行第三行

import sys

sys.setrecursionlimit(5000)

 

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。