Blutschlumpf
Fleet Admiral
- Registriert
- März 2001
- Beiträge
- 20.380
Hallo,
ich bin gerade darüber gestolpert, dass ich ein externes Programm aufrufen und die Ausgabe verwerten möchte.
Beispiel:
response ist dann vom Typ binary, da kommt dann z.B: raus:
Das System auf dem ich das mache ist Windows 10 mit Python 3.9.9
sys.stdout.encoding -> "utf-8"
sys.stdin.encoding -> "utf-8"
sys.getfilesystemencoding() -> "utf-8"
sys.getdefaultencoding() -> "utf-8"
locale.getpreferredencoding() -> "cp1252"
response.decode('utf-8') endet mit nem Fehler:
Der Encoding-Parameter im subprocess-Modul bricht auch mit nem Fehler (UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 18: invalid start byte) ab:
subprocess.check_output("ping google.com", encoding="utf-8")
Bei cp1252 siehts ähnlich aus:
Über Google bin ich drauf gestoßen, dass die Kodierung CodePage850 passen könnte.
response.decode('cp850') gibt (zumindest in dem Fall) auch das korrekte Ergebnis aus.
Aber wie komme ich da vom trial and error weg, sprich wo kann ich auslesen was die Shell (unabhängig vom OS bzw. dem verwendeten Rechner) da zurück gibt?
Mit Google habe ich nichts hilfreiches und meist auch nur uralte Antworten gefunden.
Auf nem Debian 11 ist alles incl. des Konsolen-Outputs UTF-8, da wäre das jetzt gar nicht aufgefallen.
Gibts nen besseren Weg externe Programme zu starten und encoding-Probleme komplett zu umgehen?
Der Ping-Befehl ist nur ein Beispiel, ein "dir" (Antwort enthält ein ä in Datenträger) hätte ähnliche Probleme.
ich bin gerade darüber gestolpert, dass ich ein externes Programm aufrufen und die Ausgabe verwerten möchte.
Beispiel:
Python:
import subprocess
response = subprocess.check_output("ping google.com", shell=True)
response ist dann vom Typ binary, da kommt dann z.B: raus:
Code:
b'\r\nPing wird ausgef\x81hrt f\x81r google.com [142.250.185.174] mit 32 Bytes Daten:\r\nAntwort von 142.250.185.174: Bytes=32 Zeit=12ms TTL=60\r\nAntwort von 142.250.185.174: Bytes=32 Zeit=12ms TTL=60\r\nAntwort von 142.250.185.174: Bytes=32 Zeit=12ms TTL=60\r\nAntwort von 142.250.185.174: Bytes=32 Zeit=12ms TTL=60\r\n\r\nPing-Statistik f\x81r 142.250.185.174:\r\n Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0\r\n (0% Verlust),\r\nCa. Zeitangaben in Millisek.:\r\n Minimum = 12ms, Maximum = 12ms, Mittelwert = 12ms\r\n'
Das System auf dem ich das mache ist Windows 10 mit Python 3.9.9
sys.stdout.encoding -> "utf-8"
sys.stdin.encoding -> "utf-8"
sys.getfilesystemencoding() -> "utf-8"
sys.getdefaultencoding() -> "utf-8"
locale.getpreferredencoding() -> "cp1252"
response.decode('utf-8') endet mit nem Fehler:
Code:
Traceback (most recent call last):
File "c:\git\pytest\testpad.py", line 10, in <module>
print(response.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 18: invalid start byte
Der Encoding-Parameter im subprocess-Modul bricht auch mit nem Fehler (UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 18: invalid start byte) ab:
subprocess.check_output("ping google.com", encoding="utf-8")
Bei cp1252 siehts ähnlich aus:
Code:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 18: character maps to <undefined>
Über Google bin ich drauf gestoßen, dass die Kodierung CodePage850 passen könnte.
response.decode('cp850') gibt (zumindest in dem Fall) auch das korrekte Ergebnis aus.
Aber wie komme ich da vom trial and error weg, sprich wo kann ich auslesen was die Shell (unabhängig vom OS bzw. dem verwendeten Rechner) da zurück gibt?
Mit Google habe ich nichts hilfreiches und meist auch nur uralte Antworten gefunden.
Auf nem Debian 11 ist alles incl. des Konsolen-Outputs UTF-8, da wäre das jetzt gar nicht aufgefallen.
Gibts nen besseren Weg externe Programme zu starten und encoding-Probleme komplett zu umgehen?
Der Ping-Befehl ist nur ein Beispiel, ein "dir" (Antwort enthält ein ä in Datenträger) hätte ähnliche Probleme.