通过Python调用外部程序并将输出传递给stdout

时间:2013-01-10 09:45:12

标签: python bash python-2.7

如何调用以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 个答案:

答案 0 :(得分:1)

您可以使用例如:

将此类调用的输出写入变量
variable = subprocess.Popen(
    ['ls', 'mydir/'],  # note that the command is split on whitespace
    stdout=subprocess.PIPE).communicate()[0]

答案 1 :(得分:1)

我总是使用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"

答案 2 :(得分:0)

正如Martijn Pieters已经声明的那样,您必须为stdout电话提供替代call()

基本上有两种方式: *要么提供已经打开的文件(因为您已经更改了sys.stdout,这可能会没问题) *使用stdout=subprocess.PIPE并自行阅读和处理stdout。 (不是通过subprocess.call(),而是通过subprocess.Popen()返回的对象。)

请注意,更改sys.stdout不会从操作系统的视图中真正更改进程的标准输出,而是命令程序在非常规文件描述符上输出所有内容。

答案 3 :(得分:0)

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

Python and subprocess input piping