0

首先,我只能使用 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 子进程调用?

谢谢

4

3 回答 3

1

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

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

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

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

于 2012-10-18T17:34:28.533 回答
0

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

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

于 2012-10-18T17:38:18.877 回答
0

子流程模块很好。

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

于 2012-10-18T18:58:04.430 回答