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()
당신이 표시되는 것, 그래서 수 repr
의 bytes
당신이 가지고 있습니다. 하위 프로세스에서받은 바이트의 인코딩을 알고 있다면을 사용 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
'Program Tip' 카테고리의 다른 글
JavaFX 주기적 백그라운드 작업 (0) | 2020.12.15 |
---|---|
DateTime.Parse ( "2012-09-30T23 : 00 : 00.0000000Z")는 항상 DateTimeKind.Local로 변환됩니다. (0) | 2020.12.15 |
객체 속성을 반복하는 Python (0) | 2020.12.15 |
설치된 MSI 설정의 제품 GUID를 어떻게 찾을 수 있습니까? (0) | 2020.12.15 |
동일한 빌드에 대한 Jenkins 다중 아티팩트 (0) | 2020.12.15 |