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 ?!?