2012-01-03 18 views
3

python ptyモジュールを使用して、stdin(ptyモジュールが望む)として関数を使用して端末エミュレータにいくつかのコマンドを送信し、強制終了します。私はpython pty擬似端末プロセスを使用してコマンドを送信して終了する

+0

この種のために設計されたpexpectを調べたいと思うかもしれません:http://www.noah.org/wiki/pexpect –

+0

私はptyしか利用できません。 – Emilio

+0

私はちょうど試してみました。ドキュメントから私は関数が引数のリストを受け取らないように出力と対話するためのものです –

答えて

2

まず、ptyモジュールを使用すると、Pythonがで実行されているターミナルエミュレータと通信することはできません。ありがとうござい

import pty 
cmnds = ['exit\n', 'ls -al\n'] 
# Command to send. I try exiting as last command, but it doesn't works. 

def r(fd): 
    if cmnds: 
     cmnds.pop() 
     # It seems is not executing sent commands ('ls -al\n') 
    else: 
     # Can i quit here? Can i return EOF? 
     pass 

pty.spawn('/bin/sh', r) 

のようなものを考えました。その代わり、それはPythonが こと Aにふりをすることができます端末エミュレータ。

ソースコードpty.spawn()を見ると、生成されたプロセスが実行中にPythonのstdinとstdoutを引き継ぐように設計されているように見えますが、これはあなたが望むものではありません。

あなただけの、シェルを起動それにコマンドを送信し、出力を読みたい場合は、実行したいだけで一つのコマンドがありますならば、あなたはおそらく、特に(Pythonのsubprocessモジュールをしたい、subprocess.Popenクラスの.communicate()方法でしょう助けてください)。

パイプの代わりにptyでサブプロセスを実行する必要がある場合は、os.openpty()を使用してマスターとスレーブのファイル記述子を割り当てることができます。スレーブファイルディスクリプタをサブプロセスのstdinとstdoutとして使用し、マスタファイルディスクリプタにコマンドを書き込んで、そこから応答を読み込みます。

関連する問題