2017-03-02 13 views
1

私は、サブプロセスを介して文字列として渡されるコマンドを実行しようとしています.Popen呼び出し、私はほとんどのプラットフォームとPython 3/2に依存しない方法でそれを行う方法を知りたい方法。次に例を示します。Python 2/3 subprocess.Popenと非ASCII文字

# content of test.py 
import subprocess 

with open('test.cmd', 'rb') as f: 
    cmd = f.read().decode('UTF-8') 

print(cmd) 

pro = subprocess.Popen('bash', 
    stderr=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stdin=subprocess.PIPE) 

out, err = pro.communicate(cmd) 

pro.wait() 
print(out) 
print(err) 

私はここに、ファイルからそれを読み取ることによって、非ASCII文字と文字列の通過をエミュレートしていtest.cmdのファイルの内容は次のとおりです。

echo АБВГ 

文字列読み込みが良好で、print(cmd)文の出力が正しい。どのように私は関数を通信するcmdを渡すしようとすると、それは失敗します。 Python 2では、 'ascii'コーデックで文字をエンコードできないので、strからunicodeに変換しようとしているようで、strにlatin1文字しかないと思います。 strオブジェクトを正しい方法でエンコードするにはどうすればよいですか? Python 3では、communications関数はバイトを入力としますが、どのエンコーディングを使うべきですか?パイソン2では

+0

cmdをutf-8にデコードしないと、どうなりますか? – languitar

+0

私はそれを読んだ後にcmdをデコードしないと、実際には動作しますが、デフォルトのコンソールエンコーディングとしてUTF-8を使用するOSでのみ動作します。しかし、私は状況を正確に示すためにコマンドを読んでそれをデコードしています。実際、私はPython 2と3の両方でstrオブジェクトとしてコマンドを取得しています。私はその正確なケースでそれを行う方法を探したかったのです。 – user2102508

答えて

2

それは「ASCII」コーデックは、文字をエンコードすることができないと言うので、それはそれはSTRにユニコードをエンコードしようとし

をUnicodeにそれを変換しようと思われます。明示的にエンコードしてみてくださいpro.communicate(cmd.encode('utf-8'))

+0

これはうまくいくようですが、現在のオペレーティングシステムでエンコードにUTF-8を使用するにはどうすればよいですか?たとえば、システムのbashエンコーディングを取得するにはどうすればよいですか? – user2102508

+0

あなたのファイルはエンコードされているかもしれませんが、OSに依存しません。 特定のファイルを使用するエンコードを知りたい場合は、pythonパッケージhttp://chardet.readthedocs.io/en/latest/ –

+1

を使用できます。ファイル、bashプロセスではありません。 – user2102508

関連する問題