Program Tip

Popen.communicate ()가 'hi'대신 b'hi \ n '을 반환하는 이유는 무엇입니까?

programtip 2020. 12. 15. 19:45
반응형

Popen.communicate ()가 'hi'대신 b'hi \ n '을 반환하는 이유는 무엇입니까?


누군가 내가 원하는 결과 "hi"앞에 문자 'b'가 있고 뒤에 개행 문자가 오는 이유를 설명 할 수 있습니까?

내가 사용하고 파이썬 3.3

>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
                           stdout=subprocess.PIPE).communicate()[0])
b'hi\n'

이 추가 'b'는 파이썬 2.7로 실행하면 나타나지 않습니다.


echo 명령은 기본적으로 개행 문자를 반환합니다.

이것과 비교 :

print(subprocess.Popen("echo -n hi", \
    shell=True, stdout=subprocess.PIPE).communicate()[0])

문자열 앞 b 는 파이썬 2.6 이상에서 일반 문자열과 동등한 바이트 시퀀스임을 나타냅니다.

http://docs.python.org/3/reference/lexical_analysis.html#literals


b당신이해야하는 것을 나타냅니다 bytes바이트의 바이너리 순서가 아니라 유니 코드 문자의 문자열이다. 문자가 아닌 출력 바이트를 하위 처리하므로 이것이 communicate()반환됩니다.

bytes유형은 직접하지 않습니다 print()당신이 표시되는 것, 그래서 수 reprbytes당신이 가지고 있습니다. 하위 프로세스에서받은 바이트의 인코딩을 알고 있다면을 사용 decode()하여이를 인쇄 가능한 파일로 변환 할 수 있습니다 str.

>>> print(b'hi\n'.decode('ascii'))
hi

물론이 특정 예제는 실제로 하위 프로세스에서 ASCII를받는 경우에만 작동합니다. ASCII가 아니면 예외가 발생합니다.

>>> 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…

개행은 echo hi출력 이있는 것의 일부입니다 . echo의 임무는 전달한 매개 변수를 출력하고 그 뒤에 개행을 표시하는 것입니다. 프로세스 출력을 둘러싼 공백에 관심이 없다면 다음 strip()과 같이 사용할 수 있습니다 .

>>> b'hi\n'.strip()
b'hi'

앞에서 언급했듯이 echo hi실제로는 hi\n예상되는 동작 인을 반환 합니다.

그러나 데이터를 "올바른"형식으로 가져오고 인코딩을 처리하지 않기를 원할 것입니다. 다음 과 같이 universal_newlines=True옵션을 전달하기 만하면됩니다 subprocess.Popen().

>>> import subprocess
>>> print(subprocess.Popen("echo hi",
                           shell=True,
                           stdout=subprocess.PIPE,
                           universal_newlines=True).communicate()[0])
hi

이렇게하면 Popen()이러한 원치 않는 기호가 그 자체로 대체됩니다.


b는 바이트 표현이고 \ n은 에코 출력의 결과입니다.

다음은 결과 데이터 만 인쇄합니다.

import subprocess
print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())

참조 URL : https://stackoverflow.com/questions/15374211/why-does-popen-communicate-return-bhi-n-instead-of-hi

반응형