2014-12-19 4 views
4

1 I는 두 개의 작은 파이썬 파일이 = BUFSIZE으로 바꿈에 플러싱되지 첫번째 input을 사용하여 라인을 판독하여, 다른 광고를 서브 프로세스서브 프로세스 표준 입력 버퍼

로이를 실행할

a = input() 
print('complete') 

번째 시도 인쇄

import subprocess 

proc = subprocess.Popen('./simp.py', 
         stdout=subprocess.PIPE, 
         stdin=subprocess.PIPE, 
         bufsize=1) 
print('writing') 
proc.stdin.write(b'hey\n') 
print('reading') 
proc.stdout.readline() 

위 스크립트는 "쓰기"를 인쇄 한 다음 "읽기"를 인쇄하지만 중단됩니다. 처음에는 이것이 표준 버퍼링 문제라고 생각하여 bufsize=1bufsize=0으로 변경했습니다. 그러면 문제가 해결됩니다. 그러나 문제를 일으키는 것이 표준이라고 보입니다.

bufsize=1의 경우 쓰기 아래에 proc.stdin.flush()을 추가하면 프로세스가 계속됩니다. (1) 버퍼링되지 않은 스트림이 느리므로 (2) 모든 곳에서 플러시를 추가하는 것이 오류가 발생하기 쉽기 때문에이 두 가지 접근 방법 모두 서투른 것처럼 보입니다. 왜 위의 write은 줄 바꿈에 플러시되지 않습니까? 문서에서는 서브 프로세스에 대해 stdin, stdout 및 stderr 스트림을 만들 때 bufsize이 사용되므로 newline에서 쓰기가 플러시되지 않는 원인이 무엇입니까?

+0

참으로 호기심. 'bufsize = 1'은 파이썬 2.x에서 잘 작동합니다. – tdelaney

+0

그것은 [Python 3의 버그] (http://bugs.python.org/issue21332)입니다. 텍스트 모드의 경우 고정되어 있습니다 (https://hg.python.org/cpython/rev/763d565e5840). [서브 프로세스 라인 버퍼링은 보편적 인 newlines 모드에서만 작동합니다.] (http://bugs.python.org/issue21471) – jfs

답변

4

the docs : "1은 줄 바꿈 됨 (universal_newlines = True, 즉 텍스트 모드 인 경우에만 사용 가능)"입니다. 작동 방식 :

import subprocess 

proc = subprocess.Popen('./simp.py', 
         stdout=subprocess.PIPE, 
         stdin=subprocess.PIPE, 
         bufsize=1, 
         universal_newlines=True) 

print('writing') 
proc.stdin.write('hey\n') 
print('reading') 
proc.stdout.readline() 
+0

파이썬 3.4.1과 파이썬 3.4.2 (현재 버전)에서는 [ issue21396에 의해 도입 된 수정] (http://bugs.python.org/issue21396). [issue21332] (http://bugs.python.org/issue21332)에서 수정되었습니다 (문서의 인용문은 [fix] (https://hg.python.org/cpython/rev/763d565e5840)에 의해 소개됩니다)) – jfs