在python子进程中保留bash重定向

在python子进程中保留bash重定向,python,redirect,subprocess,Python,Redirect,Subprocess,首先,我只允许使用python 2.4.4 我需要用python编写一个进程控制器,用于启动和监视各种子进程对环境的影响。每个子流程本身都是python脚本 从unix shell执行时,命令行如下所示: task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'], stdout=open('output.log', 'w'), stderr=open('err.log', 'w')) python my

首先,我只允许使用python 2.4.4

我需要用python编写一个进程控制器,用于启动和监视各种子进程对环境的影响。每个子流程本身都是python脚本

从unix shell执行时,命令行如下所示:

task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'],
    stdout=open('output.log', 'w'), stderr=open('err.log', 'w'))
python myscript arg1 arg2 arg3>output.log 2>err.log&

我对输入或输出不感兴趣,python不需要处理。python程序只需要知道 1) 每个过程的pid 2) 每个进程是否正在运行

这些过程是连续运行的

我曾尝试读取输出,然后再次将其发送到一个文件,但随后我遇到了readline不异步的问题,对此有几个答案,其中许多答案非常复杂

我如何制定一个python子流程调用来保留bash重定向操作


谢谢

如果我正确理解了您的问题,您在这里寻找的似乎是能够启动脚本列表,并将输出重定向到文件。在这种情况下,启动每个任务,如下所示:

task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'],
    stdout=open('output.log', 'w'), stderr=open('err.log', 'w'))
这样做意味着子进程的stdout和stderr被重定向到监视进程打开的文件中,但监视进程不必涉及复制周围的数据。如果需要,还可以重定向子进程stdins


请注意,您可能希望处理错误情况等,本例中未处理这些情况。

您可以使用现有的文件描述符作为subprocess.Popen的stdout/stderr参数。这应该与从运行时从bash重定向完全等效。该重定向是在fork之后使用fdup(2)实现的,并且输出永远不会触及您的程序。您可能还可以将fopen('/dev/null')作为文件描述符传递


或者,您可以重定向控制器程序的stdout/stderr,并将None作为stdout/stderr传递。孩子们应该打印到您的控制器stdout/stderr,而不需要通过python本身。这是因为子进程将继承控制器的stdin/stdout描述符,这些描述符在启动时由bash重定向。

子进程模块很好


您也可以使用os.fork()在*ix上执行此操作,并使用WNOHANG在定期的os.wait()上执行此操作。

谢谢,这是我采用的方法。我唯一有点困惑的问题是这个模块的文档。例如,它似乎表明stdout的唯一有效选项是PIPE或stdout。没有说明我可以使用任何文件描述符的文档。从“stdin、stdout和stderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为管道、现有文件描述符(正整数)、现有文件对象和无”“此外,stderr可以是STDOUT”。