문제

Python의 하위 프로세스 모듈을 사용하여 메이플의 명령 줄 인스턴스를 시작하여 메인 코드로 출력을 공급하고 리턴하는 방법은 무엇입니까? 예를 들어 나는 원한다 :

X = '1+1;'
print MAPLE(X)

"2"의 값을 반환합니다.

내가 본 가장 좋은 것은 메이플 명령 주변의 세이지 래퍼이지만, 내 목적으로 세이지의 오버 헤드를 설치하지 않고 사용하고 싶습니다.

도움이 되었습니까?

해결책 2

Alex Martelli의 팁을 사용하여 (감사합니다!), 나는 내 질문에 대한 명백한 대답을 생각해 냈습니다. 다른 사람들이 유용 할 수 있기를 희망하여 여기에 게시합니다.

import pexpect
MW = "/usr/local/maple12/bin/maple -tu"
X = '1+1;'
child = pexpect.spawn(MW)
child.expect('#--')
child.sendline(X)
child.expect('#--')
out = child.before
out = out[out.find(';')+1:].strip()
out = ''.join(out.split('\r\n'))
print out

메이플이 많은 라인에 긴 출력을 분해해야한다고 생각할 때 출력의 구문 분석이 필요합니다. 이 접근법은 향후 계산을 위해 메이플에 연결을 공개 할 수있는 이점이 있습니다.

다른 팁

하위 프로세스를 "대화식으로"구동하려고 시도하는 것은 버퍼링을 수행하는 서브 프로세스와 관련된 문제가 발생하지 않는 경우가 많습니다.

그렇기 때문에 그런 목적으로 대신 사용하는 것이 좋습니다. pexpect (창문 이외의 모든 곳 : 초자마 이 목적을 위해 정확하게 설계된 Windows) - 프로그램이 하위 프로세스의 관점에서 입력/명령을 입력하고 터미널/콘솔에서 결과를 살펴 보도록하십시오.

다음은 명령 줄 프로그램을 사용하여 대화식 IO를 수행하는 방법의 예입니다. 나는 비슷한 것을 사용하여 ispell 명령 줄 유틸리티 :

f = popen2.Popen3("ispell -a")
f.fromchild.readline() #skip the credit line

for word in words:
    f.tochild.write(word+'\n') #send a word to ispell
    f.tochild.flush()

    line = f.fromchild.readline() #get the result line
    f.fromchild.readline() #skip the empty line after the result

    #do something useful with the output:
    status = parse_status(line)
    suggestions = parse_suggestions(line)
    #etc..

이것의 유일한 문제는 잘못된 입력을 보내지 않고 프로그램이 생성 할 수있는 모든 다른 출력을 처리하는 것이 매우 부서지기 쉬우 며 시행 착오 프로세스라는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top