2010-01-12 38 views
3

我将如何使用Python中的子进程模块来启动MAPLE的命令行实例来提供并返回输出到主代码?例如,我想要:通过Python抓取MAPLE的输出

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

返回值“2”。

我见过的最好的是一个围绕着MAPLE命令的SAGE包装,但我不想为我的目的安装和使用SAGE的开销。

+0

你能描述Maple命令行界面的工作方式吗?它是像Python这样的标准读取评估打印循环,还是有一个'-c“命令”'开关,您可以使用它来立即评估命令的结果? – LeafStorm 2010-01-12 23:49:59

+0

如果过程很简单,MAPLE确实有一个-c“命令”开关,但该过程不会退出(它运行交互模式)。理想情况下,我希望将管道打开 - 即在MAPLE中计算,然后再由python再次返回到MAPLE,而不必每次启动MAPLE,因为它在启动时需要很长的加载时间。 – Hooked 2010-01-13 02:24:23

回答

3

使用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 

输出的解析需要枫认为有必要长期输出分手到多条线路。这种方法的优点是保持与MAPLE的连接,以便将来进行计算。

3

试图以“交互式”的方式驱动一个子过程,往往会遇到子过程做一些缓冲的问题,这会阻碍事物的发展。因此,我建议使用pexpect(Windows上的所有地方:wexpect在Windows上),这是专门为此目的而设计的 - 让您的程序模拟(从子进程的角度来看)用户输入输入/命令并在终端/控制台上查看结果。

0

下面是如何使用命令行程序执行交互式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.. 

与此唯一的问题是,它是非常脆弱和试错的过程,以确保你不发送任何不良的输入和处理程序可能产生的所有不同输出。