2017-12-15 17 views
1

파이프를 통해 에 연결된 일련의 프로세스에 일부 데이터를 공급하려고합니다. 그러나 나는 그것을 닫을 수 없다.왜 내 Popen 파이프 차단합니까?

p1 = subprocess.Popen("sort", stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
p2 = subprocess.Popen("uniq", stdin=p1.stdout, stdout=subprocess.PIPE) 

p1.communicate(r""" 
a 
b 
c 
a""") 
out, _ = p2.communicate() 
print(out) 

이제 프로그램이 대기 상태가됩니다. 신호를 보내야하는 또 다른 방법이 있습니까? 입력이 끝나는 p1?

은 -주의 : 나는 창문

당신은 첫 번째 프로그램에 표준 입력을 닫아야합니다
+0

FWIW (Linux에서 실행) 프로그램이 종료되고 (대부분의 경우 아무것도 인쇄되지 않음) –

답변

2

에서 실행하고 있습니다. 플랫폼과 용도에 따라 크기가 다양 파이프 사이의 버퍼 (무엇을 subprocess.PIPE 당신을 위해 생성)이 있습니다

  1. :

    어떤 것들은의 통지를 촬영합니다.

  2. 이 경우 구체적으로 sort은 정렬하기 전에 전체 입력을 읽어야합니다. (사용자가 무엇을 알지 못하면 항목을 정렬 할 수 없습니다. 그들은 아직). 여기에 내가 제작 한 예입니다 :)

    편집,

인해 2에, 그것은 수집이 완료의 신호, 파일 기술자가 폐쇄 될 때까지 기다립니다 자신의 버퍼없는거야. 난 당신이 다음 과정을 산란하기 전에 입력을 별도로 구축 할 수 있기 때문에 그것은 개인적 청소기, 직접 파이프를 사용하여 찾을 : 또한

In [2]: import os 
    ...: import subprocess 
    ...: 
    ...: # A raw os level pipe, which consists of two file destriptors 
    ...: # connected to each other, ala a "pipe". 
    ...: # (This is what subprocess.PIPE sets up btw, hence it's name! ;) 
    ...: read, write = os.pipe() 
    ...: 
    ...: # Write what you want to it. In python 2, remove the `b` since all `str`ings are `byte` strings there. 
    ...: os.write(write, b"blahblahblah") 
    ...: 
    ...: # Close stdin to signal completion of input 
    ...: os.close(write) 
    ...: 
    ...: # Spawn process using the pipe as stdin 
    ...: p = subprocess.Popen(['cat'], stdin=read) 
    ...: 
blahblahblah 

을, 프로세스의 완료를 확인 p.wait()을하거나 끝낼 수 있습니다 아직 완전한 결과를 얻지 못한 상황에서

1

면책 사항 : 여기 전문가가 아닙니다. 나는 ... 이전 communicate()을 사용하지만,하지 않은

첫째, 당신이 실행중인 프로세스의 표준 출력/표준 오류로부터 데이터를 읽어 의미 년대 docs for communicate 읽을 때 :

읽기 데이터를 표준 출력에서와 표준 에러

그래서 나는 sortp1 실행의 출력은 파이썬 프로그램에서 읽을됩니다 같아요. 정확히 말하면, 제 리눅스 머신에서 동작은 결정적이지 않습니다. 때때로 그것은 파이썬 코드이고 때때로 이라는 표준 출력을 읽는 p2/uniq입니다. 나는 그들이 단순히 데이터를 놓고 경쟁하고 있다고 생각합니다.

communicate() 일종의 콤보 인 것 같습니다. 사용 사례에 대해 너무 많이 사용합니다 (p1/sort). p2/uniq으로 문제 없습니다. 당신이 시도하는 경우 반면에


는 :

import subprocess 

p1 = subprocess.Popen("sort", stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
p2 = subprocess.Popen("uniq", stdin=p1.stdout, stdout=subprocess.PIPE) 

p1.stdin.write(r""" 
a 
b 
c 
a""") 
p1.stdin.close() 
out, _ = p2.communicate() 
print(out) 

이 작동하는 것 같다.