Проблема с кодировкой символов в модуле подпроцесса, выполняющем команду netshPython

Программы на Python
Ответить
Anonymous
 Проблема с кодировкой символов в модуле подпроцесса, выполняющем команду netsh

Сообщение Anonymous »

*этот вопрос касается только Windows.
При попытке получить все сохраненные пароли и имена Wi-Fi я столкнулся с ошибкой при выполнении команды netsh из-за неправильного кодирования символа в модуле подпроцесса.< /p>
Контекст:

Когда я запускаю netsh wlan show Profiles name=*, я замечаю, что только первый результат отображает его ключевое содержание. Итак, чтобы захватить все ключи, мне пришлось запустить команду один раз для каждого имени профиля (которое я получил через netsh wlan show Profiles). Проблема в том, что использование subprocess.run для каждого из них - это невероятно медленно, поэтому я решил использовать один процесс через subprocess.Popen и просто писать в его стандартный ввод. .

Тестовый код:

Код: Выделить всё

import subprocess
process = subprocess.Popen(
"cmd",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding='utf-8',
creationflags=subprocess.CREATE_NO_WINDOW)

process.stdin.write(f'netsh wlan show profiles name="Leonard’s iPhone iP15" key=clear\n')
process.stdin.flush()
process.stdin.write(f'echo test’test\n')
process.stdin.flush()
print(process.communicate())
запуск дает результат:

Код: Выделить всё

C:>netsh wlan show profiles name="Leonard’s iPhone iP15" key=clear
Profile "LeonardΓÇÖs iPhone iP15" is not found on the system.

C:>echo test’test
test’test
как вы можете видеть, ' был прочитан как ΓÇÖ в результате команды netsh, но правильно в области эха и ввода команды.
Эта ошибка не возникает при запуске netsh wlan show Profiles name="Leonard's iPhone iP15" key=clear непосредственно в CMD, поскольку я получаю успешный результат:

Код: Выделить всё

Profile Leonard’s iPhone iP15 on interface Wi-Fi: ...
Как правильно передать команду в netsh? Есть ли более простой способ сделать то же самое?
Дополнительная информация:

Я выбрал кодировку='utf- 8', потому что у меня были проблемы с чтением символа ' из процесса.stdout без прямого указания, что я хочу использовать utf-8. Я пробовал другие кодировки, такие как cp437 (из этого поста) и cp1252 (из locale.getpreferredencoding), но они привели к большему количеству проблем с кодированием/декодированием, чем с utf-8.


Подробнее здесь: https://stackoverflow.com/questions/793 ... sh-command
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»