Расшифровка специальных символов в Python из subproccess.run - PullRequest
0 голосов
/ 05 ноября 2018

Python версия: 3.7
ОС: Server 2008 r2 - функционирует как сервер AD

Я запускаю скрипт на python для поиска dsquery через cmd, используя следующий код:

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"

Но в тех немногих случаях в моей сети, когда у пользователей есть необычные символы в имени, такие как é или ë , я сталкиваюсь с ошибками. Принимая имя Джо Мыло

При декодировании с 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 голосов
/ 05 ноября 2018

Благодаря комментариям @lit и @vencaslac я выяснил ответ:

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

CP437 - это кодировка, используемая cmd, и при применении к моему сценарию она успешно возвращает é или любую другую

0 голосов
/ 05 ноября 2018

это скорее обходной путь, но почему бы не использовать 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])

это немного длиннее, но в итоге его будет проще использовать

...