2011-07-28 5 views
1

저는 python과 함께 pexpect를 사용하여 사용자가 웹 사이트를 통해 FORTRAN 프로그램과 상호 작용할 수있는 프로그램을 작성하고 있습니다. 내가하려고하면Pexpect를 사용하여 명령 행을 통해 Fortran과 Python 인터페이스하기

open: Permission denied apparent state: unit 4 named subsat.out.55 last format: list io lately writing sequential formatted external IO 55 

:

p = pexpect.spawn(myFortranProgram,[],5) 
p.logfile_read = sys.stdout 
p.expect("(.*)") 
p.sendline("55") 

내가 이해에서, 나는 가능성이 잘못 입력 장치에 (55)를 전송하고있는 FORTRAN 프로그램에서 나는 오류가 나타납니다입니다. 파이썬에서 pexpect를 사용하여 FORTRAN 프로그램에 입력을 올바르게 보내려면 어떻게해야합니까?

감사합니다.


편집 : p.sendline의 매개 변수가 비어있는 경우 (예를 들어, p.sendline()) 또는 예상대로 공백 만, 프로그램 진행이 포함되어 있습니다. 공백이 아닌 값을 FORTRAN 프로그램에 보내는 경우 입력 형식을 어떻게 든 지정해야합니까?

+0

그다지 진행되지 않습니다. 더 많은 도움이 필요하면 프로그램에 대한 더 많은 데이터와이를 사용하는 방법, 특히 Fortran 프로그램이 데이터를 얻는 방법을 제공해야합니다. – GreenMatt

+0

pexepect에 대한 매우 중요한 점은 linux에서만 실행됩니다. Windows 포트가 있지만 내 상자에서 실행되도록 여러 가지 문제가 발생했습니다. –

답변

1

pexpect 모듈은 전에 사용하지 않았지만 유용 할 수 있으므로이 기능을 사용해 보았습니다.

편집 : 난 당신이보고있는 오류를 복제 할 수 없었습니다

. 이 오류를 살펴보면 다른 문제로 인해 파일에서 읽는 것과 관련이 있다고 생각합니다. 내가 본 것에서 이것은 pexpect가 직접 처리하도록 설계된 것이 아닙니다. 그러나 아래의 원래 답변에 나온 예와 같이 파이프로 작업하게 만들 수 있습니다.

포트란의 I/O 스트림 5 (stdin)로 데이터를 보내는 데 문제가 없습니다. regurgitate라는 포트란 프로그램을 작성하여 "Your entry?"프롬프트를 표시 한 다음 I/O 스트림 5의 사용자 입력 행을 가져온 다음 다시 인쇄합니다. 다음 코드는이 프로그램과 함께 작동합니다

import pexpect 
child = pexpect.spawn('./regurgitate') 
child.setecho(False) 
ndx = child.expect('.*Your entry?.*') 
child.sendline('42') 
child.expect([pexpect.EOF]) 
print child.before 
child.close() 

출력은 단순히 : 내가 기대

42

정확히 무엇인지. 그러나 내 포트란 프로그램이 뭔가 다른 것을 말하면 (예 : "Your input?"), pexpect가 멈추거나 시간이 만료됩니다.

원래 제안 :

어쩌면이 pexpect.run() 샘플 당신을 도울 것입니다. 적어도 내 역류 프로그램을 실행하는 것 (입력을 허용하는 간단한 포트란 프로그램을하고 그것을 밖으로 인쇄) :

import pexpect 
out = pexpect.run('/bin/bash -c "/bin/cat forty-two | ./regurgitate"') 
print out 

출력했다 :

Your entry?
42

경우 역류 인쇄 밖으로 "당신을 기입?" 프롬프트가 나타나고 42 개 파일에 "42"(두 경우 모두 따옴표 제외)가 포함되어 있습니다.

+0

줄 바꿈 문제가있는 것으로 보입니다. 내가 child.sendline ('42 ')이라면 위의 오류가 발생합니다. child.sendline(), child.sendline ("") 또는 내용에 공백 만있는 매개 변수는 오류를 생성하지 않습니다. 나는 또한 child.sendline()과 함께 후행 CR/LF 때문에 내용을 "제출"하지만 작동하지 않는 child.send ('42 ')를 시도했지만 위의 오류가 다시 발생합니다. 이 문제를 해결할 수있는 다른 방법을 알고 있습니까? –

관련 문제