다른 프로세스에서 실행되는 대화형 콘솔 프로그램과 상호 작용

다른 프로세스에서 실행되는 대화형 콘솔 프로그램과 상호 작용

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를 확인하면 세션을 기록하여 예상 스크립트를 생성하는 데 도움이 됩니다. 조금만 가지고 놀면서 출력을 살펴보면 어떻게 작동하는지 더 잘 이해할 수 있을 것입니다.

관련 정보