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