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

我有一个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.

上一篇:python-如何为子进程提供密码并同时获取stdout


下一篇:Python子进程使用超时终止