我有一个Mathematica脚本,可以将其作为bash可执行文件从Terminal运行.我想从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)
我为有Windows的人发现了answer,这与我遇到的问题完全相同.不幸的是,他的解决方案与防火墙软件沙盒化过程有关.我已经禁用了我的软件,以检查是否可以解决它,但不能解决.我已经尝试了评论员在他的问题上提到的所有内容,但均未成功.
总之,在两种情况下都可以运行Mathematica脚本(两种情况都需要5秒钟),但是当我使用PIPE时,无法从脚本获得输出.
解决方法:
如果Mathematica不喜欢重定向的stdout,那么您可以尝试通过提供一个伪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.
如果您想获得单独的标准输出/标准错误;您可以尝试解决the bug mentioned by @Wayne Allen.