Python3 + Windows + subprocess + encoding?
Verfasst: Freitag 5. Februar 2016, 17:58
Welches encoding nimmt man wohl unter Windows um per subprocess korrektes unicode zu haben???
ergibt hier: cp1252
Das sollte doch ok sein, oder?!?
Liefert bei mir in SciTE:
sys.stdout.encoding == cp1252 und das scheint falsch zu sein:
Der Test "nötig" in output ist False
In der Ausgabe ist es auch: b'...n\x94tig...' und nach dem decode(): '...n”tig...'
Wenn ich das ganze in cmd.exe laufen lasse, ist es ok:
Der Unterschied ist, das jetzt sys.stdout.encoding == cp850 und das Ergebnis ist richtig.
Wenn ich es mit PyCharm laufen lasse, ist sys.stdout.encoding == None
Mit "cp850" Funktioniert auch die Zeile mit 'echo "abcäöüß"' korrekt.
Fazit: Encoding immer cp850 und gut?!?
SciTE und PyCharm machen mist, beim encoding des Terminals ?!?
Code: Alles auswählen
encoding = sys.stdout.encoding or locale.getpreferredencoding()
Das sollte doch ok sein, oder?!?
Code: Alles auswählen
# encoding: utf-8
import sys, locale, os
import subprocess
print(sys.stdout.encoding)
print(sys.stdout.isatty())
print(locale.getpreferredencoding())
print(sys.getfilesystemencoding())
encoding = sys.stdout.encoding or locale.getpreferredencoding()
def run(*args, **kwargs):
p = subprocess.Popen(args,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
**kwargs
)
return p.communicate()[0]
#~ output = run("cmd.exe", "/c", 'echo "abcäöüß"') # UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7: character maps to <undefined>
output = run("mkdir", "/?", shell=True)
print(type(output))
print(repr(output))
output = output.decode(encoding)
print(repr(output))
print("nötig" in output)
Code: Alles auswählen
cp1252
False
cp1252
mbcs
<class 'bytes'>
b'Erstellt ein Verzeichnis.\r\n\r\nMKDIR [Laufwerk:]Pfad\r\nMD [Laufwerk:]Pfad\r\n\r\nWenn die Befehlserweiterungen aktiviert sind, wird MKDIR folgenderma\xe1en\r\nver\x84ndert:\r\n\r\nMKDIR erstellt, wenn n\x94tig, jedes Zwischenverzeichnis. Wenn zum\r\nBeispiel das Verzeichnis \\a nicht existiert, dann entspricht\r\n\r\n mkdir \\a\\b\\c\\d\r\n\r\nder folgenden Befehlsfolge:\r\n\r\n mkdir \\a\r\n chdir \\a\r\n mkdir b\r\n chdir b\r\n mkdir c\r\n chdir c\r\n mkdir d\r\n\r\nDiese Folge von Befehlen muss angegeben werden, wenn die Befehlserweiterungen \r\nnicht aktiviert sind.\r\n'
'Erstellt ein Verzeichnis.\r\n\r\nMKDIR [Laufwerk:]Pfad\r\nMD [Laufwerk:]Pfad\r\n\r\nWenn die Befehlserweiterungen aktiviert sind, wird MKDIR folgendermaáen\r\nver„ndert:\r\n\r\nMKDIR erstellt, wenn n”tig, jedes Zwischenverzeichnis. Wenn zum\r\nBeispiel das Verzeichnis \\a nicht existiert, dann entspricht\r\n\r\n mkdir \\a\\b\\c\\d\r\n\r\nder folgenden Befehlsfolge:\r\n\r\n mkdir \\a\r\n chdir \\a\r\n mkdir b\r\n chdir b\r\n mkdir c\r\n chdir c\r\n mkdir d\r\n\r\nDiese Folge von Befehlen muss angegeben werden, wenn die Befehlserweiterungen \r\nnicht aktiviert sind.\r\n'
False
Der Test "nötig" in output ist False
In der Ausgabe ist es auch: b'...n\x94tig...' und nach dem decode(): '...n”tig...'
Wenn ich das ganze in cmd.exe laufen lasse, ist es ok:
Code: Alles auswählen
D:\>py test.py
cp850
True
cp1252
mbcs
<class 'bytes'>
b'Erstellt ein Verzeichnis.\r\n\r\nMKDIR [Laufwerk:]Pfad\r\nMD [Laufwerk:]Pfad\r\n\r\nWenn die Befehlserweiterungen aktiviert sind, wird MKDIR folgenderma\xe1en\r\nver\x84ndert:\r\n\r\nMKDIR erstellt, wenn n\x94tig, jedes Zwischenverzeichnis. Wenn zum\r\nBeispiel das Verzeichnis \\a nicht existiert, dann entspricht\r\n\r\n mkdir \\a\\b\\c\\d\r\n\r\nder folgenden Befehlsfolge:\r\n\r\n mkdir \\a\r\n chdir \\a\r\n mkdir b\r\n chdir b\r\n mkdir c\r\n chdir c\r\n mkdir d\r\n\r\nDiese Folge von Befehlen muss angegeben werden, wenn die Befehlserweiterungen \r\nnicht aktiviert sind.\r\n'
'Erstellt ein Verzeichnis.\r\n\r\nMKDIR [Laufwerk:]Pfad\r\nMD [Laufwerk:]Pfad\r\n\r\nWenn die Befehlserweiterungen aktiviert sind, wird MKDIR folgendermaßen\r\nverändert:\r\n\r\nMKDIR erstellt, wenn nötig, jedes Zwischenverzeichnis. Wenn zum\r\nBeispiel das Verzeichnis \\a nicht existiert, dann entspricht\r\n\r\n mkdir \\a\\b\\c\\d\r\n\r\nder folgenden Befehlsfolge:\r\n\r\n mkdir \\a\r\n chdir \\a\r\n mkdir b\r\n chdir b\r\n mkdir c\r\n chdir c\r\n mkdir d\r\n\r\nDiese Folge von Befehlen muss angegeben werden, wenn die Befehlserweiterungen \r\nnicht aktiviert sind.\r\n'
True
Wenn ich es mit PyCharm laufen lasse, ist sys.stdout.encoding == None
Mit "cp850" Funktioniert auch die Zeile mit 'echo "abcäöüß"' korrekt.
Fazit: Encoding immer cp850 und gut?!?
SciTE und PyCharm machen mist, beim encoding des Terminals ?!?