2012-10-18 37 views
0

首先,我只允许使用Python 2.4.4保留的bash重定向在Python子

我需要用Python语言编写,其推出的各种子进程监视它们是如何影响环境的过程控制器。每个子进程本身都是python脚本。

当从UNIX shell中执行的命令行是这个样子:

蟒蛇的MyScript ARG1参数3> output.log 2> err.log &

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

并且过程持续运行。

我已经尝试阅读输出,只是再次发送出一个文件,但后来遇到了readline不是异步的问题,其中有很多答案很复杂。

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

感谢

回答

1

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

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

这样做意味着子进程的stdout和stderr被重定向到该监控进程打开的文件,但监控进程没有参与复制数据。如果需要,您也可以重定向子进程stdins。

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

+0

谢谢,这是我采取的方法。我仍然有点困惑的唯一问题是这个模块的文档。这似乎表明,标准输出的唯一有效选项是PIPE或STDOUT。没有说我可以使用任何文件描述符的文档。 – user331905

+0

从[docs](http://docs.python.org/library/subprocess。“stdin,stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄,有效值为PIPE,现有文件描述符(正整数),现有文件对象,和None“。和“另外,stderr可以是STDOUT”。 – retracile

0

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

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

0

子流程模块很好。

你也可以在* ix上用os.fork()和一个带WNOHANG的周期性的os.wait()来做到这一点。