Pyinstaller打包matplotlib error总结

来源:互联网 发布:济南java工资线 编辑:程序博客网 时间:2024/05/20 14:44

  最近用python写了一个小程序,实现:读取txt或csv文件中的数据,按列将数据画成曲线图。原本很简单的一个程序(源码见文末),在打包时,由于包含了matplotlib,折腾了大半天才搞定,特此分享一下经验。

1,pyinstaller打包

  关于pyinstaller打包,除了pyinstaller manual之外,还可以可以参考我之前的博文——Pyinstaller程序打包。本文中用的打包命令如下:

pyinstaller --icon=umbrella.ico --onefile IQPlot.py

  非常简单,将这个python源码文件打包成一个“onefile”式的“IQPlot.exe”文件。

2,Pyinstaller Syntax error: ‘yeild’ inside async funciton

  第一次 输入上述打包命令,就得到上面这个条错误信息。google了一下,在stack overflow找到了答案,大致是:
  jinjia2这个库添加了支持新的python3.6的“异步函数”,而我的系统中安装的是python3.5,换句话说,就是“jinjia2的版本与python3.5的版本兼容性问题”。
“The reason is Jinja2 added new async function for Python3.6 in version 2.9.”
  解决办法有两个:一是将jinjia2降级到2.8.1版本

pip install --downgrade jinjia2==2.8.1

注:jiajia2是一个Jinja2 是一个仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
  第二个办法是升级Pyinstaller

pip install --upgrade pyinstaller

我选择的是第二个办法,解决了这个错误问题,但是有产生了下面两个新错误。


3,Maximum recursion depth exceeded


  解决了上面那条问题后,重新输入打包命令,又跳出了一条问题,信息如上。仔细看了一下Log,这个错误是在 “Analyze IQPlot.py”之后产生的,基本可以断定是我的python程序导入的库带来的问题。尝试注释掉导入“matplotlib”库的语句后,重新打包,打包成功。当然,这个只是验证我的推断,并没有真正解决问题。再次google,找到答案:
  修改系统递归层数限制(recursion limit),具体步骤如下:
1)生成spce文件

pyi -makespec --icon=umbrella.ico --onefile IQPlot.py

2)在生成的IQPlot.spec文件中(顶部)添加如下代码,修改“recursion limit”

# -*- mode: python -*-import syssys.setrecursionlimit(5000)

3)以这个新的spec文件为依据,输入如下命令打包:

pyinstaller IQPlot.spec



3,UnicodeDecodeError: ‘utf-8’ codec can’t decode byte…


  解决了上面两个问题后,又遇到一个问题,信息如上。这个问题在CSDN博客中找到了答案,博主也是转自GitHub,现摘抄如下:

1,在控制台(cmd)中输入:chcp 650001将控制台的编码格式变为utf-82,然后输入:pyinstaller -F -w ***.py打包成功

链接

原创粉丝点击