2012-04-19 5 views
1

私は、次の例があります。pythonサブプロセス - PIPEに新しいデータがないかどうかをチェックする方法は?

import subprocess 

p = subprocess.Popen("cmd",stdin = subprocess.PIPE, stdout=subprocess.PIPE) 
p.stdin.write(b'cd\\' + b'\r\n') 
p.stdin.write(b'dir' + b'\r\n') 
p.stdin.write(b'\r\n') 



while True: 
    line = p.stdout.readline() 
    print(line.decode('ascii'), end='') 
    if line.rstrip().decode('ascii') == 'C:\>': #I need to check at this point if there is new data in the PIPE 
     print('End of File') 
     break 

私はサブプロセスからの任意の出力のために、私は読むのをやめたいPIPEてくる新しいデータがない場合、PIPEを聴いています。私はPIPEが空であることを教えてくれるコントロールステートメントを持っていたいと思います。これは、私のプロセスが予期せぬ結果で凍結したり終了したりする場合の問題を避けるのに役立ちます。

+0

あなたは達成しようとしていることについていくつかの文脈を教えてください。あなたに何をしようとしているのか分かっているなら、あなたがやっていることをやり遂げるためのよりよい方法が私にはあるようです。 – mayhewr

+0

ここでの目的は、ターゲットデバイスのシェルを起動することです。サブプロセスを使用して、シェルにコマンドを送信してレスポンスを取得しようとしています。たとえば、ターゲットシェルを起動し、ファイルをターゲットにロードし、ファイルを実行し、出力を観察します。出力が期待どおりの場合は、次のファイルを読み込んでそのファイルを実行してください。しかし、プログラムを実行すると、予期しない値が凍結されたり返されることがあります。この場合、私は凍結を防ぐことができるようにしたい。状況から脱出し、すべてを脱初期化する。 – alkan

答えて

1

プロセスが終了していないか、または読み込みを停止すると予想される信号がない限り、パイプにデータがあるかどうかを事前に知る良い方法はありません。読み込み[.read(n)]、改行char [.readline()]、またはファイルの最後に到達するバイト数(プロセスが終了するまで存在しないバイト数)

ただし、プログラムがcmdシェルで既に実行されているため、プログラムを実行するためにcmd.exeを実行する必要はありません。

サブプロセスを使って直接プログラムを呼び出し、コード内で例外/ return_codeを処理することをお勧めします。あなたは次のようなことをすることができます...

import subprocess 
import time 

p = subprocess.Popen("your_program.exe", 
        "-f", "filename", 
        stdin=subprocess.PIPE, 
        stdout=subprocess.PIPE) 

# If you have to use stdin, do it here. 
p.stdin.write('lawl here are my inputs\n') 

run_for = 0 
while p.poll() == None: 
    time.sleep(1) 
    if run_for > 10: 
     p.kill() 
     break 
    run_for += 1 

if p.return_code == 0: 
    ...handle success... 
else: 
    ...handle failure... 

これをループで実行し、次のファイルを実行する新しいプロセスをスピンアップすることができます。

それはならながら、おそらく(それはそれは恥ずかしい取得する程度だから、今読んで停止していない場合)(これは合計ハックですが、)あなたのプロセスが実行された後、プログラムをスピンアップにコストがかかりことp.stdin.write("\n~%$%~\n")のように、特に奇妙でも無害な文字列をp.stdinに渡すことができます。あなたが離れていると得ることができるなら、あなたのような何かができる

...

for line in p.stdout.readlines(): 
    if '~%$%~' in line: 
     break 

しかし、神聖ながらくた、それをしないでください。それはそのようなハックです。

関連する問題