Python-popen() - kommunizieren( str.Codierung(encoding="utf-8", errors="ignore") ) stürzt ab
Mit Python 3.4.3 unter Windows.
Mein Skript läuft ein kleines java-Programm in der Konsole, und sollte sich die Ausgabe:
import subprocess
p1 = subprocess.Popen([ ... ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out, err = p1.communicate(str.encode("utf-8"))
Führt dies zu einer normalen
'UnicodeDecodeError: 'charmap' codec kann nicht decodieren byte 0x9d in position 135: Charakter-Karten, < undefined>'.
Ich will jetzt die Fehler ignorieren:
out, err = p1.communicate(str.encode(encoding="utf-8", errors="ignore"))
Dies führt zu einem interessanten Fehler fand ich auch keine Hilfe für die Nutzung von google:
TypeError: Deskriptor 'Kodieren' von 'str' object muss ein argument
So scheint es, dass python nicht einmal mehr wissen, was die Argumente für str.encode(...) sind. Das gleiche gilt auch, wenn Sie verlassen Sie den Fehler Teil.
InformationsquelleAutor user136036 | 2015-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
universal_newlines=True
ermöglicht text-Modus. Kombiniert mitstdout=PIPE
es Kräfte, die Entschlüsselung der Kind-Prozess " - Ausgabe mitlocale.getpreferredencoding(False)
, die nicht utf-8 unter Windows. Das ist, warum Sie sehenUnicodeDecodeError
.Lesen Teilprozess' - Ausgabe mit utf-8-Codierung, drop
universal_newlines=True
:str.encode("utf-8")
entspricht"utf-8".encode()
. Es gibt keinen Punkt, um es zu übergeben, um.communicate()
es sei denn, Siestdin=PIPE
- und der Kind-Prozess erwartetb'utf-8'
bytestring als input.str.encode(encoding="utf-8", errors="ignore)
hat die formklass.method(**kwargs)
..encode()
Methode erwartetself
(ein string-Objekt), das ist, warum Sie sehenTypeError
.Nicht verwenden
klass.method(obj)
stattobj.method()
ohne einen guten Grund.InformationsquelleAutor jfs
Sind Sie nicht anrufen sollen
.encode()
auf die Klasse selbst. Was Sie wahrscheinlich tun möchten, ist so etwas wieDie Fehlermeldung, die Sie bekommen, bedeutet, dass die
encode()
- Funktion hat nichts damit zu Kodieren, da Sie es nannte, in der Klasse, anstatt auf eine Instanz (das wäre dann vergangen, als dieself
parameterencode()
).Das ist, weil, was
std.encode("utf-8")
wirklich tut, ist die gleiche wie"utf-8".encode()
gibt... "utf-8" 🙂 du bist Also tatsächlich das senden der text "utf-8", um Ihre app - ich glaube nicht, dass das was Sie tun wollte.InformationsquelleAutor cemper93