Popen.communication()이 'hi' 대신 b'hi\n'을 반환하는 이유는 무엇입니까?
제가 원하는 결과 "안녕"이 왜 "b"자 앞에 오고 새로운 줄로 이어지는지 설명해주실 분 계신가요?
저는 파이썬 3.3을 사용하고 있습니다.
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
python 2.7로 실행하면 이 추가 'b'가 나타나지 않습니다.
그b는 유니코드 문자의 문자열이 아닌 바이트의 이진 시퀀스임을 나타냅니다.서브프로세스는 문자가 아닌 바이트를 출력하기 때문에.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()이런 원치 않는 기호들을 그 자체로 대체할 것입니다.
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는 바이트 표현이고 \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
'programing' 카테고리의 다른 글
| 표준 Excel 수식은 사용하는 Excel 버전에 따라 다르게 동작합니다. (0) | 2023.10.05 |
|---|---|
| 포크, exec, wait를 올바르게 사용하는 방법 (0) | 2023.10.05 |
| Azure App Service에서 끔찍한 성능 - Wordpress (0) | 2023.10.05 |
| WooCommerce 카트 항목 이름 변경 (0) | 2023.09.25 |
| 자바스크립트에서 빈 문자열은 항상 부울로 거짓입니까? (0) | 2023.09.25 |