web-dev-qa-db-ja.com

別のプロセスから実行中のインタラクティブコンソールプログラムとの対話

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のマニュアルページを読みましたが、それが何をするのかまだわかりません。

5
user3268289

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

はい、これは、expectで実行できる一種の処理です。ここで、expectスクリプトはプログラムBです。基本的に、文字列(おそらくコマンドプロンプト)を予期して、応答を送信します。

セッションを記録することでexpectスクリプトを生成するのに役立つautoexpectを確認してください。少し遊んでその出力を調べれば、それがどのように機能するかをよりよく理解できます。

0
Josh Famestad