2011-07-17 27 views
0

私は外部プログラムを実行しようとするpythonスクリプトを持っています。 私のプロジェクトには、クライアントがリモート端末でコマンドを実行できるようにするためのPythonトークボットが含まれています。Pythonスクリプトから外部対話型プログラムを実行する

基本的に、トークボットを組み込んだモジュールでは、私は入力を取得して出力を送信することができます。入力を受け取り、それが端末コマンドであるかどうかを確認する必要があります。

私はこれを実装するためにsubprocess.Popenオブジェクトを使用しました。

問題は、コマンドが対話的なプログラムを呼び出す場合です。入力を待って出力しますが、処理できません。最良の場合、Popenはすべての入力を待ってから出力を出します。

これを適切に行う方法はありますか。外部プログラムを起動して入力を送信し、出力を取得する。入力を送信し、出力を取得するなど。

答えて

0

pexpectが必要な場合があります。

+0

この解決方法は、私のニーズに多かれ少なかれ適しています。 – Hashken

0

私の意見では、この種の問題のための最良のモデルは、非同期シングルスレッドアプローチを使用していますが、助けのライブラリを使用してもやや複雑なコードが必要です。

何か概念的に単純では上記のコードでは、マルチスレッドアプローチ

import thread 
import sys 
import time 

def repl(): 
    while True: 
     print ">>> ", 
     sys.stdout.flush() 
     s = raw_input() 
     exec s 

def main_thread(): 
    for i in xrange(30): 
     print i 
     time.sleep(1) 

thread.start_new_thread(repl,()) 
main_thread() 

の使用で機能repl入力を待ち、プロンプトで入力されているもの次に幹部が、同時にメインプログラムであります走っている(ここでは何も面白くない、ちょうど30までカウントする)。

プログラムの複雑さによっては、これは妥当な解決策になります。あるレベルの並列実行とロジックの複雑さの後に、マルチスレッドのアプローチはいくつかの欠点(複雑で難しいロックロジックをデバッグするのに役立ちます)を示します。

関連する問題