2016-12-02 1 views
0

선택적으로 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)) 

. 누구든지 더 나은 해결책을 생각할 수 있습니까? 스트림을 분할하거나 복사하는 방법은 무엇입니까?

추가 제약 조건 : 서브 프로세스는 한 번만 호출 할 수 있습니다

  1. . 그래서 한 번에 한 행을 읽고 처리 할 수 ​​없으며 하위 프로세스로 전달할 수 없습니다.
  2. 이 솔루션은 당신을 위해
+0

, 당신은 서브 프로세스의'stdin'에'stdin' 본질적으로 앞으로 데이터를 원하십니까? – bkvaluemeal

+0

네,하지만 제가하고 싶었던 것은'stdin'을 서브 프로세스에 전달하는 것이 었습니다.'subprocess.call ([ 'cat'])'이 내가 필요한 것 전부였습니다. 나는'stdin'을 전달하고 그것을 읽고 처리 할 수 ​​있기를 원합니다. –

답변

0

합니까 파이썬 2.6에서이 일을 일해야한다?

#!/usr/bin/env python2 
import subprocess 
import sys 

p = subprocess.Popen(['cat'], stdin = subprocess.PIPE) 

line = sys.stdin.readline() 

#################### 
# Insert work here # 
#################### 

line = line.upper() 

#################### 

p.communicate(line) 

예 : 나는 상황을 제대로 이해한다면

$ echo "hello world" | ./wrapper.py 
HELLO WORLD 
+0

이 솔루션에는 두 가지 문제점이 있습니다. 1. 모든 라인이 아니라 첫 번째 라인 만 전달합니다. 'readlines' (복수형)을 사용하여 서브 프로세스와 통신 할 때 이들을 결합해야합니다. 2. 이것은 내가 이미 제시 한 해결책과 조금 뒤죽박죽이다. 그것은 전체 파일을 메모리로 읽어들이는 결함이 있습니다. 나는 더 효율적인 메모리 솔루션 (만약 존재한다면)을 찾고있다. –

+0

큰 소리로 여기에서 생각해보십시오. 서브 프로세스 이후의 코드가 잠시 동안 한 줄로 계속 읽어 들여 처리하고 처리했다면 어떻게 될까요? 당신이 찾고있는 것과 비슷한 스트리밍 방식이 아니겠습니까? – bkvaluemeal

+0

추가 제약 조건 # 1을 참조하십시오. –

관련 문제