我有一个Mathematica脚本,我可以作为终端的bash可执行文件运行。我想在Python中运行它并获得结果。这是我想要使用的代码:
proc = subprocess.Popen(["./solve.m", Mrefnorm, Mvert, Mcomp, Mangle],
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
result, err = proc.communicate()
不幸的是,结果是一个空字符串。但是,当我运行此代码时,结果将按照我的预期打印到终端窗口:
proc = subprocess.Popen(["./solve.m", Mrefnorm, Mvert, Mcomp, Mangle],
stdout=subprocess.sys.stdout,stderr=subprocess.sys.stdout)
我发现这个answer对于有窗户的人而言,这与我遇到的问题完全相同。不幸的是,他的解决方案与他的防火墙软件沙盒化过程相关。我已经禁用了我的,以检查是否可以解决它,但事实并非如此。我已经尝试了评论者在他的问题上提到的所有内容都没有成功。
总之,Mathematica脚本在两种情况下运行(两者都需要大约5秒),但是当我使用PIPE时,我无法获得脚本的输出。
答案 0 :(得分:2)
原来Mathematica 9中有一个错误,重定向stdout。见https://mathematica.stackexchange.com/questions/20954/why-doesnt-my-script-work-when-i-redirect-stdout
答案 1 :(得分:1)
我不确定为什么会这样,但我让它像这样工作:
proc=subprocess.Popen('fullpath/math -initfile fullpath/script.m' ,
shell=True,
stdout=subprocess.pipe )
由于某种原因,arg列表的列表形式不起作用,-script
不起作用。
刚刚检查过您可以传递额外的参数,只需添加到字符串
即可 proc=subprocess.Popen('fullpath/math -initfile fullpath/script.m arg1 arg2' ,
shell=True,
stdout=subprocess.pipe )
通过$CommandLine
(mathematica 9,python 2.4.3,redhat)
答案 2 :(得分:1)
如果Mathematica不喜欢重定向的标准输出,那么你可以尝试通过提供伪tty来欺骗它:
import pipes
from pexpect import run # $ pip install pexpect
args = ["./solve.m", Mrefnorm, Mvert, Mcomp, Mangle]
command = " ".join(map(pipes.quote, args))
output, status = run(command, withexitstatus=True)
你也可以use stdlib pty
module directly to capture the output。
如果你想获得单独的stdout / stderr;您可以尝试解决the bug mentioned by @Wayne Allen。