При попытке получить все сохраненные пароли и имена 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 wlan show Profiles name="Leonard's iPhone iP15" key=clear непосредственно в CMD, поскольку я получаю успешный результат:
Код: Выделить всё
Profile Leonard’s iPhone iP15 on interface Wi-Fi: ...Дополнительная информация:
Я выбрал кодировку='utf- 8', потому что у меня были проблемы с чтением символа ' из процесса.stdout без прямого указания, что я хочу использовать utf-8. Я пробовал другие кодировки, такие как cp437 (из этого поста) и cp1252 (из locale.getpreferredencoding), но они привели к большему количеству проблем с кодированием/декодированием, чем с utf-8.
Подробнее здесь: https://stackoverflow.com/questions/793 ... sh-command
Мобильная версия