Pythonインタラクティブシェルのようなインタラクティブシェルを備えたコンソールプログラムがあります。このインタラクティブプログラムAを起動し、別のプログラムBを使用してAを実行する簡単な方法はありますか?Iこのようなことをしたい:
$ /usr/bin/A&
$ #find PID of A somehow
$ somecommand "PID of A" "input string to send to A"
output string from A
$
どのような「somecommand」がこれを行うことができますか?これは、「期待」が促進することになっているものですか? expect
のマニュアルページを読みましたが、それが何をするのかまだわかりません。
expect
は別の目的のためのものです。キャプティブプログラムでコマンドを実行します。対照的に、すでにバックグラウンドで実行されているプロセスにコマンドを送信する方法を求めています。
bare-bones必要なものの最小限の例として、FIFOを作成しましょう。
$ mkfifo in
A FIFOは、あるプロセスが別のプロセスから読み取るときに書き込むことができる特別なファイルです。FIFOファイルin
:から読み取るプロセスを作成しましょう。
$ python <in &
[1] 3264
ここで、現在のシェルから実行するコマンドをpython
に送信します。
$ echo "print 1+2" >in
$ 3
python
からの出力は3
とstdoutに表示されます。 Pythonのstdoutをリダイレクトした場合は、他の場所に送信できます。
expect
の機能expect
を使用すると、キャプティブコマンドとの対話を自動化できます。 expect
でできることの例として、ファイルを作成します。
#!/usr/bin/expect --
spawn python
expect ">>>"
send "print 1+2\r"
expect ">>>"
次に、expect
を指定してこのファイルを実行します。
$ expect myfile
spawn python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1+2
3
>>>
はい、これは、expectで実行できる一種の処理です。ここで、expectスクリプトはプログラムBです。基本的に、文字列(おそらくコマンドプロンプト)を予期して、応答を送信します。
セッションを記録することでexpectスクリプトを生成するのに役立つautoexpectを確認してください。少し遊んでその出力を調べれば、それがどのように機能するかをよりよく理解できます。