从subproccess.run解码Python中的特殊字符

时间:2018-11-05 12:28:36

标签: python encoding cmd active-directory subprocess

Python版本:3.7
操作系统:Server 2008 r2-充当AD服务器

我正在运行python脚本,使用以下代码通过cmd进行 dsquery 查找:

import subprocess
instruction = "dsquery user domainroot -samid 18129"
output = subprocess.run(instruction, stdout=subprocess.PIPE, shell=True)

然后得到我运行的结果:

result = str(output.stdout.decode('ISO-8859-1'))

result = str(output.stdout.decode('utf-8'))

我都尝试过。一般来说,这很不错,我没有问题。我通常会得到类似

的结果
"CN=Joe Soap,OU=Students,dc=khs,dc=edu"

但是在我的网络中,少数情况下用户的名字有不寻常的字符,例如éë,我遇到了错误。假设名字为JoéSoap

使用UTF-8解码时,我得到

"CN=Jo\x82 Soap,OU=Students,dc=khs,dc=edu"

通过ISO-8859-1,我得到了

"CN=Jo? Soap,OU=Students,dc=khs,dc=edu"

最后,如果我直接运行cmd命令,我将得到正确的响应:

"CN=Joé Soap,OU=Students,dc=khs,dc=edu"

我在这里想念什么?除了上面提到的两种编码之外,我是否还应该使用一种特定的编码(我已经尝试了其他几种编码而没有成功)还是在这里的过程中缺少某些东西?

2 个答案:

答案 0 :(得分:0)

我认为这更多是一种解决方法,但是为什么不使用Popen而不是run?

def start_process(command=''):
     return subprocess.Popen(command.split(' '), stdout=subprocess.PIPE, shell=False, creationflags = 0x08000000)

command = start_process('string that you would normally put in cmd window')

result_string = str(command.communicate()[0])

缠绕较长时间,但最终可能更易于使用

答案 1 :(得分:0)

由于@lit和@vencaslac的评论,我找到了答案:

result = str(output.stdout.decode('CP437'))

CP437是cmd使用的编码,当应用于我的脚本时,它将成功返回é或任何