Adakah yang bisa menjelaskan mengapa hasil yang saya inginkan, "hai", diawali dengan huruf 'b' dan diikuti dengan baris baru?
Saya menggunakan Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
'B' ekstra ini tidak muncul jika saya menjalankannya dengan python 2.7
python
subprocess
popen
imaginerThat
sumber
sumber
echo hi
cetakanhi\r\n
. Untuk menghindarinya, Anda bisa menambahkan .strip () di akhir, atau perbaikan serupa.check_output()
alih-alih di.communicate()
sini:print(subprocess.check_output("echo hi", shell=True, universal_newlines=True), end="")
Jawaban:
Perintah echo secara default mengembalikan karakter baris baru
Bandingkan dengan ini:
print(subprocess.Popen("echo -n hi", \ shell=True, stdout=subprocess.PIPE).communicate()[0])
Adapun b sebelum string itu menunjukkan bahwa itu adalah urutan byte yang setara dengan string normal di Python 2.6+
http://docs.python.org/3/reference/lexical_analysis.html#literals
sumber
Ini
b
menunjukkan bahwa apa yang Anda miliki adalahbytes
, yang merupakan urutan byte biner, bukan string karakter Unicode. Subproses mengeluarkan byte, bukan karakter, jadi itulah yang ditampilkancommunicate()
.The
bytes
tipe tidak langsungprint()
mampu, jadi Anda sedang menunjukkanrepr
daribytes
yang Anda miliki. Jika Anda mengetahui pengkodean byte yang Anda terima dari subproses, Anda dapat menggunakandecode()
untuk mengubahnya menjadi dapat dicetakstr
:>>> print(b'hi\n'.decode('ascii')) hi
Tentu saja, contoh khusus ini hanya berfungsi jika Anda benar-benar menerima ASCII dari subproses. Jika bukan ASCII, Anda akan mendapatkan pengecualian:
>>> print(b'\xff'.decode('ascii')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
Baris baru adalah bagian dari apa yang
echo hi
memiliki keluaran.echo
Tugasnya adalah menampilkan parameter yang Anda lewati, diikuti dengan baris baru. Jika Anda tidak tertarik dengan spasi yang mengelilingi keluaran proses, Anda dapat menggunakanstrip()
seperti ini:>>> b'hi\n'.strip() b'hi'
sumber
os.popen
mengembalikan string teks, apakah ada cara untuk membuatnyasubprocess.Popen
juga mengembalikannya, bukan string byte.universal_newlines
yang menyebabkanPopen
objek menerima dan mengembalikan string teks.check_output("dir")
, mengekstrak nama file dari output dan kemudian mencoba mengaksesnya denganopen
akan gagal jika nama file tersebut berisi umlaut Jerman. Mungkin bug.Seperti yang disebutkan sebelumnya,
echo hi
sebenarnya kembalihi\n
, yang merupakan perilaku yang diharapkan.Tetapi Anda mungkin hanya ingin mendapatkan data dalam format yang "benar" dan tidak berurusan dengan pengkodean. Yang perlu Anda lakukan adalah memberikan
universal_newlines=True
opsi untuksubprocess.Popen()
menyukainya:>>> import subprocess >>> print(subprocess.Popen("echo hi", shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0]) hi
Cara ini
Popen()
akan menggantikan simbol yang tidak diinginkan dengan sendirinya.sumber
universal_newlines=True
bekerja seperti pesona. Ini harus menjadi jawaban yang diterima, menurut pendapat saya ...universal_newlines=True
dalamPopen
(untuk menyingkirkanb''
) danstrip()
pada string yang dihasilkan, jika Anda ingin memotong baris terminating.universal_newlines
sekarang hanya alias yang kompatibel ke belakang untuktext
parameter, yang lebih jelas tetapi hanya di Python 3.7 dan di atasnya.b adalah representasi byte dan \ n adalah hasil dari output echo.
Berikut ini hanya akan mencetak data hasil
import subprocess print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())
sumber