我正在使用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_1
在comm_2
开始之前完成。使用subprocess
执行此操作的最佳方法是什么?我不能在标准Python 2.6库之外使用python-daemon
或其他包。
nohup python myscript.py &
但是意识形态只有一种方法可以从python脚本开始工作。
答案 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
区块中捕获该异常。