ProgramingTip

Python 3 TypeError : sys.stdout.write ()를 사용하는 바이트가 아니라 str이어야합니다.

bestdevel 2021. 1. 10. 22:57
반응형

Python 3 TypeError : sys.stdout.write ()를 사용하는 바이트가 아니라 str이어야합니다.


스크립트 펼쳐에서 외부 프로세스를 실행하고 실행 중에 stdout 메시지를 인쇄하는 방법을 찾고 있습니다.
아래 코드는 작동 작동 작동 중에 표준 출력을 출력합니다. 종료되면 다음 오류가 발생합니다.

sys.stdout.write (nextline) TypeError : 바이트가 아닌 str이어야합니다.

p = subprocess.Popen(["demo.exe"],stdout = subprocess.PIPE, stderr= subprocess.PIPE)    
# Poll process for new output until finished
while True:
    nextline = p.stdout.readline()
    if nextline == '' and p.poll() != None:
        break
    sys.stdout.write(nextline)
    sys.stdout.flush()

output = p.communicate()[0]
exitCode = p.returncode

기능 3.3.2를 사용하고 있습니다.


Python 3은 약간의 약간 다르게 처리됩니다. 원래는 유형은 str. 90 년대에 유니 코드가 주목을 많이 받았을 때 unicode기존 코드 1을 깨지 않고 유니 코드를 처리하기 위해 새로운 유형이 추가되었습니다 . 이것은 str멀티 바이트 지원과 사실상 동일 합니다.

Python 3에는 두 가지 유형이 있습니다.

  • bytes유형입니다. 이것은 단지 설치의 바이트 일 뿐이며, 이는 문자로 해석하는 방법에 대해 아무것도 없습니다.
  • str유형입니다. 이것은 또한 바이트 시퀀스 이지만 Python은 전용 바이트를 문자로 해석하는 방법을 알고 있습니다.
  • 별도의 unicode유형이 삭제되었습니다. str이제 유니 코드를 지원합니다.

2에서는 인코딩이 많은 문제를 해결합니다. 잘못된 인코딩을 사용하거나 데이터에 인코딩이 없습니다 (예 : PNG 이미지).
" 명시적인 암시적인 것보다 낫다 "라는 "파이썬 철학"에 더 적합한 경우가 있습니다 .

이 변경은 많은 반환 값이 변경되지 않았기 때문에 Python 2와 호환되지 않아 이와 같은 미묘한 문제가 발생합니다. 아마도 3 채택이 그렇게 느린 주된 이유 일 것입니다. Python에는 정적 유형 2 가 없기 때문에 펼쳐집니다 (예 : 번들로 제공됨 2to3)를 사용하여 자동으로 설명 수 없습니다 .

  • 당신은 변환 할 수 있습니다 strbytesbytes('h€llo', 'utf-8'); 이것은 생성해야합니다 b'H\xe2\x82\xacllo'. 한 문자가 어떻게 3 바이트로 변환하는지 확인하십시오.
  • 당신은 변환 할 수 있습니다 bytesstrb'H\xe2\x82\xacllo'.decode('utf-8').

UTF-8은 귀하의 경우에 올바른 문자 세트가 아닐 수 있으므로 올바른 문자를 사용합니다.

코드의 특정 조각에서, nextline유형이다 bytes,하지 str, 읽기 stdoutstdin에서가 subprocess에서 3 변경 strbytes. 이것이 확실한 인코딩이 있는지 확신 할 수 있습니다. 그것은 아마도 같은 사용 sys.stdin.encoding(시스템의 인코딩),하지만 확신 할 수 없다.

다음을 교체해야합니다.

sys.stdout.write(nextline)

와 :

sys.stdout.write(nextline.decode('utf-8'))

또는 아마도 :

sys.stdout.write(nextline.decode(sys.stdout.encoding))

수정해야 우리합니다 또한 if nextline == ''으로 if nextline == b''가입일 :

>>> '' == b''
False

또한 Python 3 ChangeLog , PEP 358PEP 3112를 참조하십시오 .


1 멀티 바이트 문자 집합 할 수없는 ASCII로 할 수있는 몇 가지 멋진 트릭이 있습니다. 가장 유명한 예는 "대소 문자를 전환 할 공백이있는 xor"(예 :) chr(ord('a') ^ ord(' ')) == 'A'및 "제어 문자를 만들기 위해 6 번째 비트 설정"(예 :) ord('\t') + ord('@') == ord('I')입니다. ASCII는 비트를 조작하는 것이 성능에 효과적인 효과를 무시할 수없는 작업이었을 때 설계되었습니다.

2 예, 기능적인 주석을 사용할 수 있습니다.


하위 프로세스의 바이트가 허용되는 sys.stdout.encodingASCII를 출력하고 표준 출력이 UTF-8을 사용하는 도구에서 읽는 것과 같은 호환 가능한 인코딩을 사용하여 인코딩 된 것과 호환되는 경우 답변이 제대로 작동하지만 임의의 바이트를 표준 출력에 쓰는 올바른 방법입니다. :

sys.stdout.buffer.write(some_bytes_object)

이렇게하면 일부 인코딩의 텍스트로 처리하지 않고 그대로 바이트를 출력합니다.

참조 URL : https://stackoverflow.com/questions/21689365/python-3-typeerror-must-be-str-not-bytes-with-sys-stdout-write

반응형