他のプロセスで実行される対話型コンソールプログラムと対話する

他のプロセスで実行される対話型コンソールプログラムと対話する

Pythonインタラクティブシェルに似たインタラクティブシェルを使用するコンソールプログラムがあります。このインタラクティブプログラムAを起動し、別のプログラムBを使用してAを実行する簡単な方法はありますか?私はこのようなことをしたい:

$ /usr/bin/A&
$ #find PID of A somehow
$ somecommand "PID of A" "input string to send to A"
output string from A
$

どのような「どんな命令」がこれを行うことができますか?これが「期待」が助長すべきなのでしょうか?マニュアルページを読んでexpectいますが、まだそれが何であるかわかりません。

答え1

expect目的が異なります。依存プログラムでコマンドを実行します。逆に、すでにバックグラウンドで実行されているプロセスにコマンドを送信する方法が必要です。

としてマンボーン必要な最小限の例として、FIFOを作成しましょう。

$ mkfifo in

FIFOは、あるプロセスがデータを書き込んで別のプロセスがデータを読み取ることができる特別なファイルです。 FIFOファイルを読み込むプロセスを作成しましょうin

$ python <in &
[1] 3264

pythonこれで、現在のシェルで実行するコマンドを送信します。

$ echo "print 1+2" >in
$ 3

出力はpython標準3出力に表示されます。 Pythonの標準出力をリダイレクトすると、別の場所に送信できます。

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
>>> 

答え2

はい、これがすぐにExpectでできることです。ここで Expect スクリプトはプログラム B です。デフォルトでは、一部の文字列(おそらくコマンドプロンプト)を使用して応答を送信します。

autoexpectをチェックすると、セッションを記録して予想されるスクリプトを生成するのに役立ちます。少しだけ遊んで出力を見れば、どのように動作するかをよりよく理解することができます。

関連情報