使用多个命令运行子进程并分离到后台保持顺序

时间:2016-08-08 16:28:15

标签: python linux subprocess

我正在使用subprocess模块执行两个命令:

import shlex    
from subprocess import check_call()

def comm_1(error_file):
    comm = shlex("mkdir /tmp/kde")
    try:
        check_call(comm)
    except subprocess.CalledProcessError:
        error_file.write("Error comm_1")

def comm_2(error_file):
    comm = shlex("ls -la /tmp/kde")
    try:
        check_call(comm)
    except subprocess.CalledProcessError:
        error_file.write("Error comm_2")

if __name__ == "__main__":
    with open("error_file", "r+") as log_error_file:
         comm_1(log_error_file)
         comm_2(log_error_file)
         log_error_file.write("Success")

我知道这个设计中有一些陷阱,比如与函数共享的error_file。但这很容易被重构。我要做的是将整个过程分离到后台。我会用

完成这个
 check_call(comm, creationflags=subprocess.CREATE_NEW_CONSOLE)

但这会造成竞赛问题,因为我想确保comm_1comm_2开始之前完成。使用subprocess执行此操作的最佳方法是什么?我不能在标准Python 2.6库之外使用python-daemon或其他包。

编辑:我可以尝试使用像

这样的东西
nohup python myscript.py &

但是意识形态只有一种方法可以从python脚本开始工作。

1 个答案:

答案 0 :(得分:0)

您可以检查以确保comm_1内的进程在使用wait()comm_2内启动子进程调用之前死亡。但要这样做,您将不得不使用Popen()而不是check_call()

from subprocess import Popen

def comm_1(error_file):
    comm = shlex("mkdir /tmp/kde")
    try:
        proc_1 = Popen(comm)
        proc_1.wait(timeout=20)
    except subprocess.CalledProcessError, TimeoutExpired:
        error_file.write("Error comm_1")
在继续之前,

proc_1.wait()将等待20秒(您可以更改时间)以完成该过程。如果时间超过20秒,则会抛出TimeoutExpired异常,您可以在except区块中捕获该异常。