栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

py打包exe,遇到的坑

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

py打包exe,遇到的坑

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 sys
import os
print(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)

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/741780.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号