Python 3.4に移行する準備をしており、unicode_literalsを追加しました。私たちのコードは、サブプロセスモジュールを使用して外部ユーティリティとの間でパイプ接続することに大いに依存しています。次のコードスニペットは、サブプロセスへのパイプのUTF-8文字列にはPython 2.7で正常に動作します:Pythonサブプロセスをunicode_literalsに移行するエンコーディングを修正するにはどうすればよいですか?
kw = {}
kw[u'stdin'] = subprocess.PIPE
kw[u'stdout'] = subprocess.PIPE
kw[u'stderr'] = subprocess.PIPE
kw[u'executable'] = u'/path/to/binary/utility'
args = [u'', u'-l', u'nl']
line = u'¡Basta Ya!'
popen = subprocess.Popen(args,**kw)
popen.stdin.write('%s\n' % line.encode(u'utf-8'))
...blah blah...
次の変更は、このエラーをスロー:
from __future__ import unicode_literals
kw = {}
kw[u'stdin'] = subprocess.PIPE
kw[u'stdout'] = subprocess.PIPE
kw[u'stderr'] = subprocess.PIPE
kw[u'executable'] = u'/path/to/binary/utility'
args = [u'', u'-l', u'nl']
line = u'¡Basta Ya!'
popen = subprocess.Popen(args,**kw)
popen.stdin.write('%s\n' % line.encode(u'utf-8'))
Traceback (most recent call last):
File "test.py", line 138, in <module>
exitcode = main()
File "test.py", line 57, in main
popen.stdin.write('%s\n' % line.encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
任意の提案が通過UTF-8を渡しますパイプ?あなたがunicode_literals
を使用する場合
両方で同じに動作するためのおかげこれは、まったく同じ状況と問題を抱えていて、このスレッドは大きな助けとなりました。また、いくつかの単純なケースでは、 'sh.py'(https://github.com/amoffat/shから入手可能)は、'サブプロセス狂気。 – user5359531