1

如何调用用 bash 脚本编写的外部程序,使该脚本产生的输出在 sys.stdout 中可用,以便我可以通过 python 将输出记录到文件中。

例如。我现在通过以下代码段调用它们

if os.name == 'nt':
    path = module_dir_run+'/run.bat'
else:
    path = module_dir_run+'/run.sh'
if os.path.isfile(path):
    if (splitargs.arg):
        try:
            call([path, splitargs.arg])
        except:
            pass
    else:
        try:
            call([path])
        except:
            pass
else:
    print "Not found : " + path

当我存储它的值时,sys.stdout = file(filename, "w")它会存储 python 输出的任何内容,而不是脚本输出的内容。

注意:我试图运行的脚本是一个交互式脚本,所以在调用结束后,控制又回到了 python,我怎样才能得到终端中写的所有内容?有什么建议么?

4

4 回答 4

2

我总是使用 subprocess.Popen() 从 Python 脚本中运行另一个程序。例子:

import subprocess

print "Starting process..."
process = subprocess.Popen(["echo", "a"], shell=False)
process.wait()
print "Done"

您可以将进程的输出重定向到另一个文件,如下所示:

import subprocess

print "Starting process..."
with open("./out.log", "w") as f:
    process = subprocess.Popen(["echo", "a"], shell=False, stdout=f)
    process.wait()
print "Done"

也可以通过“stderr”参数重定向stderr。

当您将sys.stdout当前脚本重定向以写入您自己的文件时,您也可以这样做以将其重定向到您的子进程中:

import subprocess
import sys

sys.stdout = open("./out.log", "w")
print "Starting process..."
sys.stdout.flush()
process = subprocess.Popen(["echo", "a"], shell=False, stdout=sys.stdout)
process.wait()
print "Done"
于 2013-01-10T10:02:50.443 回答
1

您可以使用例如将此类调用的输出写入变量:

variable = subprocess.Popen(
    ['ls', 'mydir/'],  # note that the command is split on whitespace
    stdout=subprocess.PIPE).communicate()[0]
于 2013-01-10T10:00:58.420 回答
0

正如 Martijn Pieters 所说,您必须stdout为您的call()通话提供替代方案。

基本上有两种方法: * 要么提供一个已经打开的文件(因为你已经改变了你的sys.stdout,这可能会很好) * 使用stdout=subprocess.PIPE和阅读和对待stdout你自己。(不是通过subprocess.call()then ,而是通过返回的对象subprocess.Popen()。)

请注意,sys.stdout从操作系统的角度来看,更改不会真正改变您进程的标准输出,而是会命令您的程序将所有内容输出到一个不常见的文件描述符上。

于 2013-01-10T09:59:34.907 回答
0

这可能有用。特别是因为大多数其他答案不明白您需要将父 shell 的标准输入重定向到子进程的标准输入,因为您调用的程序/脚本是“交互式的”。

Python 和子进程输入管道

于 2013-01-10T13:23:25.603 回答