subprocess.check_callを取得して、コマンドの生のバイナリ出力を得るには、どこかで正しくエンコードしていないようです。Pythonはsubprocess.check_callから生のバイナリを取得しません
詳細:
私はこのようなテキストを返すコマンドがあります。
some output text “quote” ...
(これらの引用符はユニコードe2809dある)
は、ここで私は、コマンドを呼んでいる方法は次のとおりです。
f_output = SpooledTemporaryFile()
subprocess.check_call(cmd, shell=True, stdout=f_output)
f_output.seek(0)
output = f_output.read()
問題はこれです:
(私は 'ord'と '?'を呼ぶと63になります。) LinuxのPython 2.7です。
注:OSXで同じコードを実行すると、正しく動作します。問題は、Linuxサーバーで実行しているときです。
呼び出される可能性のあるプログラムは、stdoutの内容に応じて出力を調整します。通常のファイルを開き、実際に書き込まれているバイト数を確認する方法ところで、 'SpooledTemporaryFile'は殺し過ぎです。 「スプールされた」部分は、Pythonから書かれたものに対してのみ機能します。ファイルディスクリプタを取得すると、それを通常の一時ファイルに変更しました。余分なStringIOバッファは使用されませんでした。 – tdelaney
私はutf-8文字列を吐き出すあなたのプログラムが私のために働いた、素早いpythonプログラムを書いた。 – tdelaney
シェルでコマンドを実行し、ファイルにリダイレクトしてみてください。 'vim'がインストールされている場合は、ファイルの16進ダンプを表示できる' xxd'も必要です。あなたのテキスト例では、utf-8の出力は次のようになります: '' '0000000:736f 6d65 206f 7574 7075 7420 7465 7874一部の出力テキスト 0000010:20e2 809c 7175 6f74 65e2 809d 202e 2e2e ...引用... .. 。 '' '左引用符は' e2 80 9c'で、右引用符は 'e2 80 9d'です。 –