2013-05-25 20 views
5

Sehr gut, ich habe ein kleines Problem mit dem Ausgang des Themas, die ich in Unicode bekommen oder ich denke, und nicht lassen Sie mich es zu utf-8 konvertieren, dann ist dies der Code:Python 3 subprocess Fehler in Bytes

import subprocess,sys,time 

string = b'dir' 
process = subprocess.Popen('cmd.exe', shell=True,cwd="C:\\",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None) 
process.stdin.write(string) 
o,e=process.communicate() 
process.wait() 
process.stdin.close() 
print (o.encode('utf-8')) 

springen ich folgende Fehlermeldung:

**Traceback (most recent call last): 
    File "C:\Documents and Settings\francisco\Escritorio\k.py", line 12, in <module> 
    print (o.encode(utf-8)) 
AttributeError: 'bytes' object has no attribute 'encode'** 

, wenn ich das drucken drucken verlassen und wenn Sie mich lassen:

print(o) 

aber es druckt die fo llowing:

**b'Microsoft Windows XP [Versi\xa2n 5.1.2600]\r\n(C) Copyright 1985-2001 Microsoft Corp.\r\n\r\nC:\\>\xa8M\xa0s? '** 

und wenn ich ändern diese beiden Zeilen:

string = bytes('dir',encoding="utf-8") 
print (n[0].decode("latin")) 

drucke ich nur einen Teil des Ausgangs

, die fehlschlägt?


Ich habe diese Art und Weise gelöst:

process.stdin.write("dir\n".encode()) 
o,e=process.communicate() 
print (o.decode("utf-8")) 

aber ich bekomme Fehler:

Traceback (jüngste Aufforderung zuletzt): Datei „C: \ Dokumente und Einstellungen \ francisco \ Escritorio \ k.py ", Zeile 6, in drucken (o.decode (" utf-8 ")) UnicodeDecodeError: 'utf-8' Codec kann Byte 0xa3 in Position 103 nicht dekodieren: ungültiges Startbyte

Ich drucke es wie folgt aus:

print (o.decode("latin")) 

in Latein, ich diesen Fehler korrigieren und es in utf-8 drucken?

+0

Wie wird 'n' definiert? – unutbu

Antwort

10

o, der erste Rückgabewert von proc.communicate(), ist bereits bytes nicht str, so wird es bereits in einiger Codierung codiert (oder Sie können als nur eine Folge von Bytes davon halten).

In Python3 bytes kann -str decodiert und str kann zu bytes codiert sein, aber bytes kann niemals codiert werden, und str kann nie entschlüsselt werden. Deshalb Python3 wegen wiederholten

AttributeError: 'bytes' object has no attribute 'encode' 
+0

"In Python3 können Bytes in str dekodiert werden". OK. *Wie*? Ihre Antwort erklärt warum, aber gibt keine Lösung oder ein Beispiel ... –

+0

@OlivierPons Vielleicht versuchen Sie 'o.decode ('utf-8')'? – Mattijn

+0

Die Lösung war, * nichts * hinzuzufügen. Um eine Lösung für die Frage zu finden, ist es wie 'print (o)' anstelle von 'print (o.decode (" latin "))'. –