在Python中后台运行多个外部程序,并在脚本结束后继续执行
本文介绍如何在Python脚本中启动并保持三个外部程序在后台独立运行,即使Python脚本结束,它们也能继续执行。这类似于在命令行中使用&
符号将进程放入后台。目标是使用Python代码模拟以下命令:
./a -a 1 2 > log_a ./b -a 2 > log_b ./c -a 3 > log_c
Python脚本只负责启动程序,不阻塞其运行,且在脚本结束后,a、b、c三个程序继续独立运行。
关键在于使用subprocess
模块的Popen
函数。Popen
启动新进程并提供控制,而不会阻塞Python脚本。与subprocess.call
或subprocess.run
不同,Popen
不会等待子进程结束,从而实现非阻塞执行。
以下代码片段实现了此功能(请将./a
、./b
、./c
替换为实际程序路径):
import subprocess processes = [] processes.append(subprocess.Popen(['./a', '-a', '1', '2'], stdout=open('log_a', 'w'), stderr=subprocess.PIPE)) processes.append(subprocess.Popen(['./b', '-a', '2'], stdout=open('log_b', 'w'), stderr=subprocess.PIPE)) processes.append(subprocess.Popen(['./c', '-a', '3'], stdout=open('log_c', 'w'), stderr=subprocess.PIPE)) # Python脚本继续执行其他任务... 或直接结束。 # 子进程将继续运行,不受Python脚本结束的影响。 #可选:错误处理 for process in processes: error = process.communicate()[1] if error: print(f"Error from subprocess: {error.decode()}")
这段代码使用Popen
分别启动三个进程,并将标准输出重定向到各自的日志文件。stdout=open('log_a', 'w')
至关重要,它将程序输出写入文件,避免干扰Python脚本。 添加了stderr=subprocess.PIPE
来捕获标准错误输出,以便进行错误处理。 最后循环遍历进程,检查是否有错误输出,并打印出来。
Python脚本结束后,这三个进程将继续独立运行,直到它们自身完成。