Es izmantoju šo kodu, lai iegūtu standarta izvadi no ārējās programmas:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Metode communicate() atdod baitu masīvu:
>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Tomēr es gribētu strādāt ar rezultātu kā parastu Python virkni. Es varētu to izdrukāt šādi:
>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2
Es domāju, ka tieši tam ir paredzēta binascii.b2a_qp() metode, bet, kad es to izmēģināju, es atkal saņēmu to pašu baitu masīvu:
>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Kā es varu pārvērst baitu vērtību atpakaļ rindā? Es domāju, izmantojot "baterijas", nevis darot to manuāli. Un es gribētu, lai tas būtu OK ar Python 3.
Lai izveidotu virkni, ir nepieciešams dekodēt baitu objektu:
>>> b"abcde"
b'abcde'
# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8")
'abcde'
Jums ir nepieciešams atšifrēt baitu virkni un pārvērst to rakstzīmju (Unicode) virknē.
Python 2
encoding = 'utf-8'
'hello'.decode(encoding)
vai
unicode('hello', encoding)
Python 3
encoding = 'utf-8'
b'hello'.decode(encoding)
vai
str(b'hello', encoding)
Es domāju, ka jūs to patiešām vēlaties:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')
Aaron's atbilde bija pareiza, izņemot to, ka jums ir jāzina, kādu kodējumu izmantot. Un es domāju, ka Windows izmanto 'windows-1252'. Tam būs nozīme tikai tad, ja jūsu saturā būs kādas neparastas (neASCII) rakstzīmes, bet tad tas būs svarīgi.
Starp citu, fakts, ka tam ir nozīme, ir iemesls, kāpēc Python pārgāja uz divu dažādu tipu izmantošanu binārajiem un teksta datiem: tas nevar brīnumaini konvertēt starp tiem, jo tas nezina kodējumu, ja vien jūs tam to nepasakāt! Vienīgais veids, kā jūs to uzzināt, ir izlasīt Windows dokumentāciju (vai lasīt to šeit).