私はいくつかの引数を持つシェルスクリプトを呼び出すFlaskアプリケーション(Linux、mod_wsgi、Python 3を持つApache)を持っています。非ASCII文字がsubprocess.run()
コマンドの引数である場合、次のエラーがアプリケーションで発生します。subprocess.run()引数のエンコーディング
'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
私はそれを修正しようとしている多くの時間を費やしました。
このような問題はコマンドラインには存在せず、アプリケーション内にのみ存在します。
アプリケーション全体の出力はUnicodeであり、問題はありません。いくつかの研究の後、私は結論に至りました。問題は "ファイルシステムエンコーディング"です。
run.wsgi
スクリプトにいくつかのロギングステートメントを追加しました。 FSエンコーディングは実際には 'ascii'(コマンドラインでは 'utf-8')でした。
LANG=C
で開始されたこの記事
How to change file system encoding via python?
を見つけました。 /etc/sysconfig/httpd
の警告にもかかわらず、C.UTF-8
に変更しました。それは助けにならなかった、FSエンコーディングはまだ 'ascii'だった。私はさらに、sys.getfilesystemencoding()
からlambda: 'utf-8'
に猿のパッチを当てました。しかし、エラーはまだそこにあります。
変更するたびに正しくhttpdサービスを再起動しました。
私は私の知恵の終わりです。
- 私の問題は実際にはFSエンコーディングによって引き起こされますか?
- 「はい」の場合、utf-8に変更しようとしましたが失敗したのはなぜですか?
- 最も重要な点:この問題を解決するにはどうすればよいですか?
UPDATE1:
コードスニペット:のmod_wsgiのコンテキストで
import subprocess as sub
cmdresult = sub.run(
[SCRIPT, tid, days, name],
stdin=sub.DEVNULL, stdout=sub.PIPE, stderr=sub.DEVNULL,
encoding='ascii', # 'utf-8' will not help, this affects stdin, stdout I/O only
check=True)
あなたは 'shell = True'を使って起動していますか?引数を文字列またはリストとして渡していますか? 'subprocess'モジュールを使っている実際のコードを表示してください。 –
OSレベルでは、 'exec()'と友人はサブプロセスに渡す引数にどのエンコーディングを使用したか気にしません:POSIXは '' char * '文字列として表現できることを要求します。それらをデコードするサブプロセスに渡します。 –
@DanielPrydenコードが追加されました。デフォルトでは 'shell = False'です。 – VPfB