我正在使用 python 脚本在 Ubuntu Server 18.04 中创建 MOTD。我在尝试显示硬盘温度时发现了这个问题。我想使用度数符号来显示温度##°C
,但是当我登录到服务器时,输出不会显示。删除度数符号解决了问题。
示例代码
#!/usr/bin/python3
print(u"\u00B0" + "C")
print("°C")
print('°' + "C")
print('\u00B0' + "C")
文件保存为00-testpython
,并从命令行运行脚本按预期输出:
$ ./00-testpython
°C
°C
°C
°C
运行脚本会run-parts
返回预期的响应:
$ run-parts --lsbsysinit /etc/update-motd.d
°C
°C
°C
°C
使用 ssh 登录会显示旧版本中的内容/run/motd.dynamic
,并且不会按照预期的 MOTD 进行更新。
我有一种强烈的感觉,这与编码有关,但我不确定它是什么。从python打印可以使用ANSI转义字符进行彩色打印;我不确定为什么这会引起问题。
使用 bash 脚本来回显度数符号效果很好:
#!/bin/sh
echo °
答案1
正如我怀疑的那样,结果是一个编码问题。我在 MOTD 中发现了一个与编码类似的问题,这里有我需要的答案:
https://serverfault.com/a/207357LANG
当我从登录的控制台 运行命令检查环境变量时,我得到了值:
$ echo $LANG
C.UTF-8
但是,如果我将相同的命令放入 MOTD (bash) 脚本中,则LANG
在登录时该命令为空。我认为在这种情况下默认值将是 ASCII,这在编码度数符号时会导致问题。
为了解决这个问题,我只需要在我的脚本中添加以下行:
export LANG="C.UTF-8"
我将这一行放入 bash 脚本中,然后该脚本调用我的 python 脚本。我无法使用以下命令让它在 python 脚本中工作os.environ['LANG'] = "C.UTF-8"