2017-11-30 2 views
0

for 루프의 각 인스턴스는 추가 처리를 위해 다른 스크립트에서 캡처해야하는 하나의 바이너리 파일의 내용을 출력합니다. 예를 들어 :파이썬 for 루프를 다른 스크립트로 반복 한 파이프 출력

script1.py

filename = glob.glob('*.txt') 
for i in range(len(filename)): 
    with open(filename[i], 'rb') as g: 
     sys.stdout.write(g.read()) 

는 script2.py

from subprocess import call 
script = "cat > test.fil" 
call(script,shell=True) 

는 명령 :이 명령을 실행하면

python script1.py | python script2.py 

, 그것은 대기 모든 반복을 완료하려면 출력을 script2.py에 파이프하기 전에. 나는 이것을 일괄 적으로하고 싶다. 예를 들어, 한 바이너리 파일의 데이터가 stdout으로 푸시되면, script2.py를 실행하십시오.

script2.py는 script1.py에서 호출 할 수 없습니다. 두 스크립트는 서로 다른 도커 컨테이너에서 실행해야합니다. 도커 컨테이너 안에 도커 설치를 피하는 것이 좋습니다.

+0

이유는 바로 읽을'stdin' 대신 직접 그것을 할 쉘을 사용하려고의 두 번째 스크립트? (쉘을 사용하여 할 수는 있지만, 'stdin'에 연결하지는 않았지만, 그걸 가장 쓸모없는 고양이라고합니다. (http://porkmail.org/era/unix/award .html) 나는 이제까지 본 적이있다.) – kindall

+1

'script2.py'는'script1.py'가 그것들을 쓰는 방법에 관계없이 똑같은 연속적인 바이트 스트림을 보게 될 것이다. 'script1.py'의 출력에 추가 바이트를 삽입하고 파싱하지 않고도 다른 파일의 바이트를 확실하게 구별 할 수는 없습니다. – chepner

+0

@chepner, 무슨 일을 할 수 있는지 보여 주시겠습니까? – Vishnu

답변

1

sys.stdout이 파이프에 연결되어 있으면 기본적으로 버퍼링됩니다. 당신은 출력을 플러시 sys.stdout.flush()를 호출해야합니다 :

sys.stdout.write(g.read()) 
sys.stdout.flush() 

두 번째 스크립트는 또한 그것을 읽고, 고양이를 연상하는 대신 쉘을 불러 일으키는의, 표준 입력을 직접 읽을 수 있습니다. 당신이 작성한 방식으로 3 개의 프로세스 (파이썬, 쉘, 캣)를 실행하고 있습니다. 당신은 단지 색인 list에 번호를 사용하려고 할 때 관련이없는 노트에서

import shutil 
import sys 
with open('test.fil', 'w') as f: 
    shutil.copyfileobj(sys.stdin, f) 

, 당신은 숫자 rangefor 루프를 사용하지 필요성을 . for 루프는 list 요소에 직접적으로 반복 할 수

filenames = glob.glob('*.txt') 
for filename in filenames: 
    with open(filename, 'rb') as g: 
     ... 
+1

'flush'는 파일이 파이프 버퍼보다 ​​작은 경우에만 강제 출력을 수행합니다. 두 번째 스크립트가 특정 파일의 바이트를 식별하는 것을 돕지는 않습니다. – chepner

+0

@nosklo 당신은 고양이를 사용할 필요가 없지만 script2가 chepner가 언급 한 방식과 같이 다른 파일을 확실하게 구분할 수있는 방법이 있습니다. – Vishnu

관련 문제