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)