pATAq 发表于 2021-11-28 16:46:54

【更新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)

狭维失 发表于 2022-10-14 14:42:12

在klipper/klippy/extras/virtual_sdcard.py 文件   
直接注释代码:gcmd.respond_raw("File opened:%s Size:%d" % (filename, fsize))

可以临时解决。

pATAq 发表于 2022-10-14 23:14:09

狭维失 发表于 2022-10-14 14:42
在klipper/klippy/extras/virtual_sdcard.py 文件   
直接注释代码:gcmd.respond_raw("File opened:%s Siz ...

现在都Python3 Klipper了,没有这问题。升级Python3才是根本的解决方法xD
页: [1]
查看完整版本: 【更新2】跟思兼学习Klipper(04) 解决Klipper不支持中文gcode文件