2012-01-22 2 views
3

파이썬에 문제가 있습니다. 나는 실행중인 스크립트에서 출력을 얻고 다른 스크립트에서 사용하려고합니다. 그래서 제가하고 싶은 것은 이것과 같습니다.Python으로 실행중인 스크립트에서 stdout을 읽음

out.pyin.py이 이와 같다고 가정하십시오.

# out.py 
def main(): 
    while True: 
     print "test" 
     time.sleep(10) 
main() 

# in.py 
text = sys.stdin.readline() 
print "hello " + text 

이 같은 스크립트를 실행하려면,

$ python out.py | python in.py 

하지만, 대신에 "안녕하세요 테스트"10 초마다 인쇄이 중지되고 인쇄 아무것도. 이것으로부터, 나는 out.py이 끝날 때까지 |이 기다릴 것으로 짐작하고 있습니다. 그렇다면 데비안에서 in.py를 사용하려면 어떻게해야할까요?

내 실제 문제는; arpwatch에서 출력을 얻으려고합니다. arpwatch가 데몬으로 실행되고 ip/mac 쌍을 표준 오류로 보냅니다. 나는 그 산출물을 얻고 그것을 파싱하고 싶다; 그래서 나는 이런 것을 필요로한다.

$ arpwatch | python myscript.py 

이 코드를 작성하려면 myscript.py을 어떻게 작성해야합니까? subprocess module,을 사용하려고했지만 다시 성공하지 못했습니다. 제 영어 실력이 좋았 기 때문에 제 문제를 명확하게 설명 할 수 있기를 바랍니다.

도움 주셔서 감사합니다.

답변

4

문제는 버퍼링 중 하나입니다. 당신이 arpwatch이 자신을 일에 의존해야합니다, 불행하게도

import sys 
import time 

def main(): 
    while True: 
     print "test" 
     sys.stdout.flush() 
     time.sleep(10) 
main() 

; 그것은 만약 당신이 명시 적으로 플러시 표준 출력 out.py에서 멀리 간다 그렇지 않은 경우에는 파이프 대신 PTYs을 시도해보십시오. 터미널로 계산되기 때문에 대부분의 응용 프로그램에서 블록 버퍼링 대신 줄 버퍼링을 사용하게됩니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 매력처럼 작동합니다 : arpwatch에 대해서는 pty를 살펴볼 것입니다. –

+1

@MuhammetCan : 천만에. 'pexpect'에 대해 말한 것을 잊어 버리십시오. 프로세스의 표준 출력만을 읽을 때 필요하지 않습니다. 'pty' 모듈로 충분합니다. –

관련 문제