Harici bir programdan standart çıktı almak için bu kodu kullanıyorum:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Communications () yöntemi bir bayt dizisi döndürür:
>>> 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'
Ancak, çıktı ile normal bir Python dizesi olarak çalışmak istiyorum. Böylece şöyle yazdırabilirim:
>>> 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
Binascii.b2a_qp () yöntemi bunun için olduğunu düşündüm , ama denediğimde, yine aynı bayt dizisini aldım:
>>> 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'
Bayt değerini dizeye nasıl geri dönüştürebilirim? Yani, manuel olarak yapmak yerine "pilleri" kullanmak. Ve Python 3 ile iyi olmasını istiyorum.
str(text_bytes)kodlamayı belirleyemiyoruz. Text_bytes içinde ne olduğuna bağlı olarak, text_bytes.decode('cp1250) `için çok farklı bir dizeye neden olabilir text_bytes.decode('utf-8').
strişlev artık gerçek bir dizgeye dönüşmez. Bir nedenle nedenini okumak için tembel olmak için nedense açıkça bir kodlama söylemeliyim. Sadece dönüştürün utf-8ve ur kodunun çalışıp çalışmadığını görün. örneğinvar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)Python 3'te beklendiği gibi çalışır. Ancak unicode_text = bytestring.decode(character_encoding), str(bytes_obj)metne bytes_objkodunu çözmek yerine bir metin temsili üreten karışıklıktan kaçınmak daha çok tercih edilir : str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'vestr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)? Bu bana tuhaf geliyor.