使用pyinstaller打包程序
Kale

最近在使用pyinstaller打包程序的时候,遇到了很多问题。

路径问题

平时在写程序的时候,涉及到文件的读取和写入时,用绝对路径较多,但是绝对路径只在自己电脑可以正常运行,换一个环境就会报错,于是了解了一下相对路径。

相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。

在相对路径中,/是指根目录开始,./表示从当前目录开始,../表示从上一级目录开始。

但是这种写法在打包成exe可执行程序的时候就会出现问题,原因是打包成exe可执行文件后目录发生改变。所以可以用另外一种方式得到可执行文件的路径,根据可执行文件的路径来推出其余所需文件的路径,这种方法打包好之后可以在别的环境正常运行。下面上代码:

创建一个.py文件,功能是得到目前文件的路径,用以被别的文件调用(也可以在需要获取路径的.py文件里写成函数形式)

1
2
3
4
5
6
import sys
import os
def app_path():
if hasattr(sys, 'frozen'):
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)

别的文件需要使用时,直接调用这个函数即可,完美解决路径问题。

文件过大

第一次使用pyinstaller -D xxx.py进行打包后,打包过程很慢,打包后的程序有600多mb,打开dist文件夹,发现有很多我没有用到的包被导入,例如numpy等,网上了解到打包后文件过大的原因是因为安装python时用的是anaconda,集成了很多包,而在使用pyinstaller打包时,很多没必要用到的库也被一并打包进去,所以打包后的文件过大。

解决方案是安装一个叫pipenv的库,这个库的作用是创建一个python的虚拟环境。

  • 首先在任意目录创建一个文件夹,用来储存虚拟环境

  • cd到该文件夹,输入pip install pipenv,安装pipenv

  • pipenv shell进入虚拟环境,然后安装需要用到的库,比如我需要用到jieba库,输入pip install jieba即可,安装好需要用到的库之后,再pyinstaller -D xxx.py --noconsole进行打包这里的--noconsole是取消程序运行时的控制台显示

  • 打包完成,查看文件大小,从600多mb缩小到90多mb,还是非常可观的

闪退问题

这个问题属实困扰了我很久,打包后在自己电脑上可以运行,但换个环境就闪退,修改过很多次代码,但都没有成功。

之前尝试过通过注释代码看有无返回值的方式来判断哪段代码有问题,定位到一行代码,换了一种方式去实现这行代码的功能,但是打包后依然失败。

之前每次打包的时候都会输入--noconsole来取消控制台的显示,所以虽然闪退,但是看不到闪退信息,通过命令行运行也还是看不到报错信息。

一次打包时没有输入--noconsole,导入到虚拟机运行,发现是可以看到报错信息的,不出所料,果然是jieba库出现了问题。报错信息为:
avatar

这是因为jieba会到默认目录寻找dict.txt,我们只需要将默认目录改到指定目录就行了,这里以打包生成的exe所在目录为例

1
2
3
import jieba
jieba.set_dictionary(".\dict.txt")
jieba.initialize()

这样打包生成的exe执行时就会在指定目录寻找dict.txt文件。

重新打包到虚拟机调试,运行成功。

  • 本文标题:使用pyinstaller打包程序
  • 本文作者:Kale
  • 创建时间:2019-10-02 01:56:26
  • 本文链接:https://kalew515.com/2019/10/02/使用pyinstaller打包程序/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!