2013-05-25 16 views
5

Bardzo dobrze, mam mały problem z wyjściem wątku, dostaję w Unicode lub myślę i nie pozwól mi przekonwertować go na utf-8, jest to kod:python 3 błąd podprocesowy w bajtach

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

skaczę następujący błąd:

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

gdybym wydrukować pozostawiając odcisk i jeśli mi pozwolisz:

print(o) 

ale drukuje 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? '** 

i jeśli zmienię te dwie linie:

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

wydrukować tylko część produkcji

że się nie powiedzie?


I został rozwiązany w ten sposób:

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

ale dostaję błąd:

Traceback (najnowsza rozmowę ostatni): pliku „C: \ Documents and Settings \ Francisco \ Escritorio \ k.py ", wiersz 6, w print (o.decode (" utf-8 ")) UnicodeDecodeError: kodek" utf-8 "nie może dekodować bajtu 0xa3 w pozycji 103: niepoprawny bajt początkowy

po prostu wydrukować go tak:

print (o.decode("latin")) 

w latin, mogę naprawić ten błąd i wydrukować go w UTF-8?

+0

Jak zdefiniowano 'n'? – unutbu

Odpowiedz

10

o, pierwsza wartość zwracana z proc.communicate() jest już bytes nie str, więc jest już zakodowane w jakimś kodowaniu (lub można myśleć o tym jak tylko sekwencję bajtów).

W Python3 bytes mogą być dekodowanedo str i str może być zakodowane do bytes, ale bytes nigdy nie może być zakodowane i str nigdy nie mogą być dekodowane. Właśnie dlatego Python3 narzeka,

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

"W Python3 bajtów można dekodować do str". Ok. *W jaki sposób*? Twoja odpowiedź wyjaśnia dlaczego, ale nie daje rozwiązania lub przykładu ... –

+0

@OlivierPons Może spróbuj 'o.decode ('utf-8')'? – Mattijn

+0

Rozwiązaniem było dodanie * nic *. Aby dać rozwiązanie tego pytania, to jest jak 'print (o)' zamiast 'print (o.decode (" latin "))'. –