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

时间:2012-10-18 17:23:34

标签: python redirect subprocess

首先,我只允许使用python 2.4.4

我需要在python中编写一个进程控制器,它启动并且各种子进程监视它们如何影响环境。这些子进程中的每一个本身都是python脚本。

从unix shell执行时,命令行看起来像这样:

python myscript arg1 arg2 arg3> output.log 2> err.log&

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

这些过程持续不断。

我已经尝试在输出中读取并再次将其发送出一个文件然后我遇到了readline不是异步的问题,其中有几个答案很多都非常复杂。

如何制定保留bash重定向操作的python子进程调用?

由于

3 个答案:

答案 0 :(得分:1)

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

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

这样做意味着子进程的stdout和stderr被重定向到监视进程打开的文件,但监视进程不必涉及复制数据。如果需要,您还可以重定向子进程stdins。

请注意,您可能希望处理此示例中未处理的错误情况等。

答案 1 :(得分:0)

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

或者,您可以重定向控制器程序的stdout / stderr,并将None作为stdout / stderr传递。孩子们应该打印到你的控制器stdout / stderr而不通过python本身。这是有效的,因为子节点将继承控制器的stdin / stdout描述符,这些描述符在发布时被bash重定向。

答案 2 :(得分:0)

子进程模块很好。

你也可以在* ix上使用os.fork()和一个带有WNOHANG的定期os.wait()来执行此操作。