Ubuntu Server 18.04でPythonスクリプトを使用して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"