首先,我只允许使用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子进程调用?
由于
答案 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()来执行此操作。