2017-12-14 12 views
0

でサブプロセスにラインごとの印刷中に、タイムアウトを使用してパイソン - (Pythonの3.5で)popenの

私は((プログラムを実行している間)行ずつ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" を実行している間に、これら2件の観光名所:

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"を使用すると、プログラムの終了時間が経過するのを待ちます。それ以外の方法で使用すると、プログラムはタイムアウトをカウントしません。

私はスレッディングなしでやりたいと思っていますが、可能であればioもなくても可能ですが、どのように(もっと練習と勉強が必要ですか)わかりません。 :-(

PS:私が実行しているプログラムは、fortranで書かれており、水の流れをシミュレートするために使用されます。ウィンドウから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) 
除き、です