2014-12-07 1 views
2

파이프의 쓰기 끝이 닫히는 것을 알 수있는 방법을 생각하고 있습니다. 어떻게 든 그것을 할 수있는 방법이 있습니까? 내가 피하기 위해 노력하고있어파이프의 쓰기 끝이 닫혀 있는지 확인하십시오.

from subprocess import Popen, PIPE 
p = subprocess.Popen('ls -lh', stdout = PIPE, shell = True) 

def read_output(out,queue): 
    for line in iter(out.readline,b''): 
     print('.') 

t = Thread(target=enqueue_output, args=(p.stdout,q)) 
t.daemon = True 
t.start() 

while True: 
    #this only works if I put 
    #if line == '' : 
    # out.close() 
    #in the for loop of read_output, which I want to avoid. 

    if p.stdout.closed : #need to find something else than closed here... 
     break 

IOW 내가 어떻게 든 쓰기 알고 속성이나 p.stdout하는 방법을 읽고 싶은 .... 입출력 스레드에 out.close()를해야합니다 끝이 닫혔습니다.

이것은 Popen의 p.stdout을 우아하게 읽는 또 다른 방법을 찾는 것이 아니며 이미 다른 2 가지 방법이 있습니다. 그것은 가능한 것이어야한다고 생각했던 것을 배우는 것에 관한 것입니다. 그러나 나는 어떻게 해야할지 알지 못했습니다 ...

건배!

답변

1

파이프가 손상되면 표준 출력에 쓰면 IOError가 발생합니다. 당신은 errno 속성을 IOError을 잡기 확인하여이를 감지 할 수 있습니다

import errno 

while True: 
    print "Hello" 
except IOError as e: 
    if e.errno == errno.EPIPE: 
     print >>sys.stderr, "Error writing to closed pipe" 

또는, 당신은 SIGPIPE가 수신 될 때의 신호 처리기를 설치할 수 있습니다.

import signal 
def sigpipe_handler(e): 
    # Do whatever in response to a SIGPIPE signal 

signal.signal(signal.SIGPIPE, sigpipe_handler) 
+0

답장을 보내 주셔서 감사합니다. 그러나 이것은 내가 찾고있는 것이 아닙니다. p는 쉘을 생성하는 서브 프로세스입니다. p.stdout은 쉘 프로세스에 의해 쓰여지고 나를 읽습니다. 나는 쉘 프로세스를 가장 할 수 없으며 stdout에 쓰려고 할 수도 없다. 쉘 프로세스가 파이프의 끝을 닫았는지를 알고 싶을뿐입니다. Readline 대신 p.stdout에서 read_raw를 수행하면 EOFError가 발생하지만 readline은이를 잡아내어 아무 것도 얻지 못합니다. 나는 여전히 p.stdout의 쓰기 측면에 대한 핸들을 볼 수있는 방법이 있다고 생각한다. – caliloo

관련 문제