我在Python的子过程中遇到问题,该子过程返回unicode字符,尤其是德语ü,ä,ö字符。
我的脚本基本上想要打开一个子进程,该子进程使用stdout.read()
函数返回一些字符串。这些字符串中的某些可能包含Unicode字符,但是并不总是知道这些字符是否以及在哪里。因此,必须以某种方式对输出进行解码(或编码?)以正确显示字符串。
我无法使用字节对象。
以下代码简要显示了我的操作,但未能解码该字符串,因此“ UnicodeDecodeError:'utf-8'编解码器无法解码位置12的字节0x81:无效的起始字节”错误消息:
import subprocess
command_array = ['echo', 'string_with_ü_ä_ö']
command = subprocess.Popen(command_array, stdout=subprocess.PIPE, shell=True)
command_output = command.stdout.read()
command_output = command_output.decode()
print(command_output)
我觉得必须有一些琐碎的解决方案,但是我找不到任何地方。有什么方法可以正确返回字符串中的那些unicode字符?
我正在使用Python 3.6.3,并且以上脚本在Windows上运行。同样适用于Linux的版本也会受到赞赏!
答案 0 :(得分:0)
对于Python> = 3.6,您希望subprocess.run()
与universal_newlines=True
import subprocess
command_array = ['echo', 'string_with_ü_ä_ö']
result = subprocess.run(command_array,
stdout=subprocess.PIPE, universal_newlines=True)
print(result.stdout)
在Python 3.7中,universal_newlines
别名被text
取代,从而更好地说明了该选项的实际作用。
答案 1 :(得分:0)
通过反复试验,我发现使用cp850
进行解码可以正常工作并产生预期的输出:
import subprocess
command_array = ['echo', 'string_with_ü_ä_ö']
command = subprocess.Popen(command_array, stdout=subprocess.PIPE, shell=True)
command_output = command.stdout.read()
command_output = command_output.decode('cp850')
print(command_output)
如果将以上代码另存为utf8
编码文件(无论平台如何,python3的默认文件),然后将其与python3一起运行,则会打印:
string_with_ü_ä_ö
不幸的是,我不知道在何处或为何选择此特定编码,因此这可能不适用于不同的设置,但至少我相信它会与您的设置兼容。