将输出从Mathematica脚本重定向到PIPE而不是stdout使用subprocess.Popen Yields Null String

时间:2014-02-05 20:54:06

标签: python wolfram-mathematica subprocess

我有一个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时,我无法获得脚本的输出。

3 个答案:

答案 0 :(得分:2)

答案 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