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')
.
str
iş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-8
ve 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_obj
kodunu çö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.