선택적으로 STDIN의 입력을 받아들이는 프로그램 용 래퍼 스크립트를 작성하고 있습니다. 내 스크립트는 파일의 각 행을 처리해야하지만 STDIN을 랩핑하는 프로그램으로 전달해야합니다. 실제로 cat
은, 그냥 STDIN가 제대로 전달되고 있는지 여부를 입증하는 예로서 역할을 포장하는 것을 시도하고 있지 않다표준 입력에서 읽기 및 파이썬의 하위 프로세스로 전달
import subprocess
import sys
for line in sys.stdin:
# Do something with each line
pass
subprocess.call(['cat'])
참고 : 미니멀 한 형태로,이 같은 것을 보인다.
위의 예제에서 for 루프를 주석 처리하면 제대로 작동합니다. 그러나 for 루프로 실행하면 이미 STDIN의 끝까지 읽었 기 때문에 아무 것도 전달되지 않습니다. 스트림을 찾을 수 없기 때문에 파일의 시작 부분에 seek(0)
을 넣을 수 없습니다.
한 가지 가능한 해결책은 메모리에 전체 파일을 읽을 수 있습니다 : 작동하지만, 매우 메모리가 효율적이지
import subprocess
import sys
lines = sys.stdin.readlines()
for line in lines:
# Do something with each line
pass
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
p.communicate(''.join(lines))
. 누구든지 더 나은 해결책을 생각할 수 있습니까? 스트림을 분할하거나 복사하는 방법은 무엇입니까?
추가 제약 조건 : 서브 프로세스는 한 번만 호출 할 수 있습니다
- . 그래서 한 번에 한 행을 읽고 처리 할 수 없으며 하위 프로세스로 전달할 수 없습니다.
- 이 솔루션은 당신을 위해
, 당신은 서브 프로세스의'stdin'에'stdin' 본질적으로 앞으로 데이터를 원하십니까? – bkvaluemeal
네,하지만 제가하고 싶었던 것은'stdin'을 서브 프로세스에 전달하는 것이 었습니다.'subprocess.call ([ 'cat'])'이 내가 필요한 것 전부였습니다. 나는'stdin'을 전달하고 그것을 읽고 처리 할 수 있기를 원합니다. –