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

标签 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-daemon 或标准 Python 2.6 库之外的其他包。

编辑:我可以尝试使用类似的东西

nohup python myscript.py &

但想法是只有一种方法可以从 python 脚本启 Action 业。

最佳答案

您可以使用 wait() 检查以确保 comm_1 中的进程在 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 block 中捕获该异常。

关于python - 使用多个命令运行子进程并分离到后台保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38834243/

相关文章:

linux - 如何以编程方式在 GNOME 中设置自定义文件夹图标?

linux - ubuntu 上的 Scons/Doom 3 编译错误

Python Telegram 机器人作业队列

python - Python数据结构的大O分析列表

Python 的格式不适用于包含 JSON 的文本

linux - 如何跨 sda1 和 sda2 管理 Linux 服务器存储

python - 从 python 异常中杀死 Bash 脚本

Python 3.3+ : How to suppress exceptions in subprocess. Popen()?

python - 在 tkinter 中同时运行两个脚本

Python-SqlAlchemy : Filter query by great circle distance?