【更新2】跟思兼学习Klipper(04) 解决Klipper不支持中文gcode文件
跟着思兼学习Klipper(04) 解决新版 Klipper 不支持中文 gcode 文件问题## **前言**
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。【思兼 sjqlwy#gmail.com 2021年11月28日】
由于 Klipper 更新频率太高,新功能无法充分在各种情况下进行测试,所以经常有朋友升级之后出现各种报错,无法使用。这里介绍如何解决升级新版 Klipper v0.10.0-167 之后,无法使用含有中文(或者其他特殊符号) gcode 文件的问题。
~~【2021年12月5日 更新】修复使用 Klipper Python3 后,内存占用显示不正确的问题。~~
【2021年12月18日 更新】
* 增加关于自动共振抑制测试命令的问题介绍
* 官方已经解决内存占用显示不正确问题:(https://github.com/Klipper3d/klipper/commit/62cfc2527f4824f1373a2819552f81ffd877b599)
### 1、精简版
1. 修改 KIAUH 助手脚本,使能 Klipper Python3
```shell
# Switch to Python3
sed -i 's|python2|python3|g' ~/kiauh/scripts/install_klipper.sh
```
2. 使用 KIAUH 助手删除旧版 Klipper Python2
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211128154842.png)
3. 重新安装 Klipper(Python3)
### 2、详解版
我之前一直使用的是 0.91 没升级,这次趁着重新调整主板,就想着顺便升级下主板固件,看看新的温敏传感器配置 `sensor_type: Generic 3950` 是否效果更好。于是问题来了,开始报错。总结一下升级之后会出现的问题及原因:
* Q1:**树莓派和主板固件版本不一致** | Klipper 固件由运行在树莓派上的【Klippy】和运行在主板上的【固件】组成,两者相辅相成,并且需要版本尽量一致。并且不管你使用多少块主板都要同步升降级,包括将树莓派作为 MCU 使用的情况。
* Q2:**新版 Klipper 固件不支持中文 gcode 文件** | 随着 Python2 停止维护,[作者之前说过](https://klipper.discourse.group/t/upcoming-v0-10-0-release/791) 新版的 Klipper v0.10.0 会逐渐转向使用 Python3,这次的问题就是 Python2 转 Python3 带来的 non-ASCII 编码问题。Moonraker 则一直使用Python3 开发。
其实关于版本升级,由于 Klipper 更新太快,有些功能用不到,我们挑有用的功能对应的版本升级就可以了。具体可以在四处找到更新信息:
* **<u>版本发布</u>** ((https://www.klipper3d.org/Releases.html))
* **<u>配置文件更改</u>** ((https://www.klipper3d.org/Config_Changes.html))
* **官方提交** ((https://github.com/Klipper3d/klipper/commits/master))
* **合并申请** ((https://github.com/Klipper3d/klipper/pulls?q=is%3Apr+sort%3Aupdated-desc))
一般大家关注前 2 个就行,第 4 个有些改动则没有被合并到主分支。
#### 2.1 问题描述
我之前上传有中文名称的 gcode 文件正常使用,升级到 `v0.10.0-167` 后报错,内容如下:
`{'message': "'ascii' codec can't decode byte 0xe6 in position 3: ordinal not in range(128)", 'error': 'WebRequestError'} Internal error on command:"M20"`
查询手册发现 `M20` 命令是列出 SD 卡内文件,手动执行也报错,搜索也发现有其他人遇到这个问题([一](https://github.com/Klipper3d/klipper/issues/4794)、[二](https://github.com/Klipper3d/klipper/issues/4777)、[三](https://github.com/Klipper3d/klipper/issues/4871))。
#### 2.2 解决方法
方法么,有两种:
#### 2.2.1 使用 Release 版本
```shell
cd ~/klipper
# 注意会固定使用 Release 版本无法自动更新
git checkout v0.10.0
# 如果想恢复使用最新版本
git checkout master
```
#### 2.2.2 使用 Klipper Python3
Klipper 其实一直都在测试迁移到 Python3,相关讨论:
* (https://github.com/Klipper3d/klipper/issues/14) | on 9 Jun 2017
* (https://github.com/Klipper3d/klipper/pull/3278) | on 7 Oct 2021,**介绍切换方法**
* (https://github.com/Klipper3d/klipper/pull/4772) | on 4 Sep 2020
要求是系统安装有 Python v3.6 及以上。对应的开发分支为:`work-python3-20211001`
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211128162439.png)
我们参考 (https://github.com/Klipper3d/klipper/pull/3278) 里面介绍的方法,切换到 Klipper Python3:
```shell
# 停止 Klipper 服务
sudo service klipper stop
# 克隆最新的 work-python3-20211001 分支
cd ~/klipper && git fetch && git checkout origin/work-python3-20211001
# 创建 Python 虚拟环境
virtualenv -p python3 ~/python3-env
~/python3-env/bin/pip install -r ~/klipper/scripts/klippy-requirements.txt
# ~/python3-env/bin/python ~/klipper/klippy/klippy.py ~/printer.cfg -l /tmp/klippy.log
# 修改 Klipper 服务内容
sudo nano /etc/systemd/system/klipper.service
# ExecStart=/home/pi/python3-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/printer.cfg -l /home/pi/klipper_logs/klippy.log -a /tmp/klippy_uds
# 重新载入 Klipper 配置并重启
sudo systemctl daemon-reload
sudo systemctl restart klipper
```
此时我们可以看到 Klipper 0.10.0 正常启动,并且 `M20` 可以正常列出 SD 卡带中文名称的 gcode 文件了。但是这种有个问题,我无法使用最新版的 Klipper 所带来的新功能。于是我们继续查看该分支的最新提交,发现其实新版 Klipper 已经可以较好地运行在 Python2/Python3 上了,只要修改安装脚本 `install-octopi.sh` 中为 `python3` 即可。
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211128163318.png)
对应查看 KIAUH 助手,[也不支持](https://github.com/th33xitus/kiauh/issues/109) Klipper Python3,修改 `install_klipper.sh` 重新安装,成功。
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211128163549.png)
注意,此种情况会出现在 `KIAUH 助手` 以及 `FluiddPI OS` 上,前者是因为尚未切换到 Klipper Python3,后者是因为最新的 Fluidd v1.16.2 发布于2021年07月10日,彼时还停留在 `Klipper v0.91 Python2`。
### ~~3、修复内存占用显示不正确的问题~~【已解决】
如下图所示,迁移到 Klipper Python3 后,偶然发现内存占用一直是 100%,参考 (https://github.com/Klipper3d/klipper/pull/4964) ,进行修复,后续版本估计会更新。
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211205035456.png)
如下图所示修改 `klipper/klippy/extras/statistics.py`:
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211205040813.png)
```shell
sed -i 's/import os, time, logging/import os, time, logging, io/g' ~/klipper/klippy/extras/statistics.py
sed -i '0,/meminfo/{s/open/io.open/}' ~/klipper/klippy/extras/statistics.py
sed -i '0,/meminfo/{s/rb/r/}' ~/klipper/klippy/extras/statistics.py
sudo systemctl restart klipper
```
!(https://cdn.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211205041136.png)
### 4、 关于自动共振抑制测试的问题
有朋友提问说切换到 Klipper Python3 后,使用 `SHAPER_CALIBRATE` 命令执行自动测试时会报错,类似 `import matplotlib` 时提示缺少库。我们以 `SHAPER_CALIBRATE` 为关键词搜索 Klipper 源码,锁定 `klipper/scripts/calibrate_shaper.py` [脚本](https://github.com/Klipper3d/klipper/blob/master/scripts/calibrate_shaper.py),前两行内容如下:
```python
#!/usr/bin/env python2
# Shaper auto-calibration script
#
# Copyright (C) 2020Dmitry Butyugin <dmbutyugin@google.com>
# Copyright (C) 2020Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
from __future__ import print_function
import importlib, optparse, os, sys
from textwrap import wrap
import numpy as np, matplotlib
```
其它共振抑制相关脚本也是如此:
```python
#!/usr/bin/env python
# Script to plot input shapers
```
我们回过来看 [官方文档](https://www.klipper3d.org/Measuring_Resonances.html#software-installation) 关于软件安装部分的命令:
```shell
~/klippy-env/bin/pip install -v numpy
sudo apt update
sudo apt install python-numpy python-matplotlib
```
**真相大白:**
1. Klipper 默认使用 Python2 创建虚拟环境,位于 `~/klippy-env/bin/`
2. numpy 包主要用于数学计算,安装两次:
* 第 1 次安装到 Klipper 虚拟环境,用于测量加速度计噪音等,根据创建时使用 Python2 还是 Python3 安装对应版本
* 第 2 次安装到系统,python-numpy 一般是 Python2,python3-numpy 一般是 Python3
3. matplotlib 包主要用于绘图,所以只安装一次
4. 默认自动测定命令调用系统的 Python2 而不是虚拟环境中的,当没有安装相关包时就会报错
**解决方法:**
1. 如果继续使用 Python2 来生成数据,请注意正常安装 `python-numpy`和 `python-matplotlib` 包即可
2. 如果想使用 Python3 来运行脚本,请不要使用自动测定命令,参考 [文档](https://www.klipper3d.org/Measuring_Resonances.html#measuring-the-resonances_1) 手动使用 `TEST_RESONANCES AXIS=` 命令测定 X/Y 即可
```shell
sudo apt update
sudo apt install python3-numpy python3-matplotlib
python3 ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_*.csv -o /tmp/shaper_calibrate_x.png
python3 ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_y_*.csv -o /tmp/shaper_calibrate_y.png
```
也可以修改 `calibrate_shaper.py` 内容为 `#!/usr/bin/env python3` ,但是使用默认 python2 的脚本比较多,需要一个个修改,相对麻烦一些。
4. 可能有用的调试命令:
```shell
python -V
~/klippy-env/bin/python -V
# 查看软件包安装状态,第二列 i 代表软件包安装并完成配置,下图代表 python2/3 版本的 numpy 已经正确安装
pi@blv:~ $ dpkg -l *numpy
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===============-============-============-==================================================================
iipython-numpy 1:1.16.2-1 armhf Numerical Python adds a fast array facility to the Python language
unpython2.7-numpy <none> <none> (no description available)
iipython3-numpy 1:1.16.2-1 armhf Fast array facility to the Python 3 language
unpython3.7-numpy <none> <none> (no description available)
```
###题外话
欢迎对 Klipper 固件感兴趣,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638) 在klipper/klippy/extras/virtual_sdcard.py 文件
直接注释代码:gcmd.respond_raw("File opened:%s Size:%d" % (filename, fsize))
可以临时解决。
狭维失 发表于 2022-10-14 14:42
在klipper/klippy/extras/virtual_sdcard.py 文件
直接注释代码:gcmd.respond_raw("File opened:%s Siz ...
现在都Python3 Klipper了,没有这问题。升级Python3才是根本的解决方法xD
页:
[1]