Problem mit der Zeichenkodierung, wenn das Unterprozessmodul den Befehl „netsh“ ausführtPython

Python-Programme
Guest
 Problem mit der Zeichenkodierung, wenn das Unterprozessmodul den Befehl „netsh“ ausführt

Post by Guest »

*Diese Frage gilt nur für Windows.
Beim Versuch, alle gespeicherten WLAN-Passcodes und -Namen abzurufen, ist beim Ausführen eines Netsh-Befehls ein Fehler aufgetreten, da ein Zeichen durch das Unterprozessmodul falsch codiert wurde.< /p>
Kontext:

Wenn ich netsh wlan showprofiles name=* ausführe, fällt mir auf, dass nur das Das erste Ergebnis zeigt seinen Hauptinhalt an. Um alle Schlüssel zu erfassen, musste ich den Befehl also einmal für jeden Profilnamen ausführen (den ich über „netsh wlan show Profiles“ erhalten habe). Das Problem besteht darin, dass die Verwendung von subprocess.run für jeden davon unglaublich langsam ist, also habe ich mich entschieden, einen Prozess über subprocess.Popen zu verwenden und einfach in dessen stdin zu schreiben .

Code testen:

Code: Select all

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())
Das Ausführen hat das Ergebnis:

Code: Select all

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
Wie Sie sehen können, wurde das ' im Netsh-Befehlsergebnis als ΓÇÖ gelesen, im Echo- und Befehlseingabebereich jedoch korrekt.
Dieser Fehler tritt nicht auf, wenn netsh wlan showprofiles name="Leonard's iPhone iP15" key=clear direkt in CMD ausgeführt wird, da ich das erfolgreiche Ergebnis erhalte:

Code: Select all

Profile Leonard’s iPhone iP15 on interface Wi-Fi: ...
Wie kann ich dafür sorgen, dass der Befehl korrekt an netsh übergeben wird? Gibt es eine einfachere Möglichkeit, dasselbe zu tun?
Zusätzliche Details:

Ich habe Encoding='utf- gewählt. 8', weil ich Probleme hatte, das Symbol ' aus Process.stdout zu lesen, ohne direkt anzugeben, dass ich utf-8 verwenden wollte. Ich habe andere Kodierungen wie cp437 (aus diesem Beitrag) und cp1252 (aus locale.getpreferredencoding) ausprobiert, aber diese führten zu mehr Kodierungs-/Dekodierungsproblemen als mit utf-8.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post