2017-12-14 16 views
0

와 하위 프로세스에 라인으로 라인을 인쇄하는 동안 제한 시간을 사용파이썬 - (파이썬 3.5)는 popen

I가 ((프로그램을 실행하는 동안) 라인으로 라인 STDOUT 인쇄 및 타임 아웃 기능을 유지하는 데 어려움을 겪고

언젠가 후에 프로그램을 중단하십시오).

나는이 :

import subprocess as sub 
import io 

file_name = 'program.exe' 
dir_path = r'C:/directory/' 

p = sub.Popen(file_name, cwd = dir_path, shell=True, stdout = sub.PIPE, stderr = sub.STDOUT) 

그리고 잠시

는 "P"를 실행하고,이 두 가지 수행

for line in io.TextIOWrapper(p.stdout, encoding="utf-8"): 
    print(line) 

그리고 수행

try: 
    outs = p.communicate(timeout=15) # Just to use timeout 

except Exception as e: 
    print(str(e)) 
    p.kill() 

이 프로그램은 모든 출력 라인을 인쇄해야을 그러나 15 초 이상 시뮬레이션을 실행해서는 안됩니다.

"p.stdout"앞에 "p.communicate"를 사용하면 프로그램이 끝날 때까지 기다립니다. 다른 방법으로 사용하면 프로그램에서 시간 초과를 계산하지 않습니다.

나는 스레딩없이 그것을하고 싶다. 가능하다면, 가능하다. 그러나 나는 어떻게 (더 많은 연습과 공부가 필요한지) 모르겠다. :-(

추신 : 저는 실행중인 프로그램을 포트란으로 작성하여 물의 흐름을 시뮬레이트하는 데 사용됩니다. 창에서 exe를 실행하면 cmd가 열리고 각 타임 스텝마다 한 행이 인쇄됩니다. exe 파일에 입력을 변경 민감도 분석.

답변

0

프로세스의 \ 자식 프로세스가 당신의 시도를 수정 제대로 을 살해지고 있지 않기 때문에 다음과 같이

try: 
    pid_id=p.pid 
    outs = p.communicate(timeout=15) # Just to use timeout 


except Exception as e: 
    print(str(e)) 
    import subprocesss 
    #This will kill all the process and child process associated with p forcefully 
    subprocess.Popen('taskkill /F /T /PID %i' % pid_id) 
제외입니다
관련 문제