2013-05-25 11 views
5

Molto bene, ho un piccolo problema con l'uscita del filo, ho entrare in Unicode o credo e non mi permetta di convertirlo in utf-8, questo è il codice:pitone errore 3 sottoprocesso in byte

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')) 

io salto il seguente errore:

**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'** 

se stampo lasciando la stampa, e se me lo permetti:

print(o) 

ma stampa la 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? '** 

e se cambio queste due righe:

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

stampare solo una parte della produzione

che non riesce?


ho risolto in questo modo:

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

ma ottengo l'errore:

Traceback (chiamata più recente scorso): file "C: \ Documents and Settings \ Francisco \ Escritorio \ k.py ", riga 6, in print (o.decode (" utf-8 ")) UnicodeDecodeError: il codec 'utf-8' non può decodificare il byte 0xa3 in posizione 103: byte di avvio non valido

mi basta stampare in questo modo:

print (o.decode("latin")) 

in latino, posso correggere questo errore e stamparlo in utf-8?

+0

Come viene definito 'n'? – unutbu

risposta

10

o, il primo valore restituito da proc.communicate(), è già bytes non str, quindi è già codificato in qualche codifica (o si potrebbe pensare ad esso come solo una sequenza di byte).

In python3 bytes può essere decodificato a str, e str possono essere codificati a bytes, ma bytes può mai essere codificato, e str può mai essere decodificato. Questo è il motivo per cui Python3 si lamenta,

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

"In Python3 byte possono essere decodificati in str". Ok. *Come*? La tua risposta spiega perché, ma non fornisce una soluzione o un esempio ... –

+0

@OlivierPons Forse prova 'o.decode ('utf-8')'? – Mattijn

+0

La soluzione era aggiungere * nothing *. Per dare una soluzione alla domanda, è come 'print (o)' invece di 'print (o.decode (" latin "))'. –