Python subprocess无法后台独立运行shell脚本问题求助
我懂你这个痛点——想用Python的subprocess启动一个后台任务,让它自己跑完就行,不用主进程一直等着,但要么一启动进程就终止了,要么用wait()/communicate()又得卡着主进程没法继续。下面几个方法应该能解决你的问题:
方案1:Unix/Linux/macOS下用
start_new_session参数 在类Unix系统中,给Popen加上start_new_session=True,可以让子进程脱离主进程的会话组,这样主进程结束后,子进程依然能继续运行直到完成:
import subprocess # 启动sleep 10作为后台任务,主进程无需等待 subprocess.Popen(["sleep", "10"], start_new_session=True)
原理是这个参数会让子进程创建一个新的会话,不再受主进程的控制信号影响,自然就能独立跑完任务。
方案2:重定向标准流避免IO阻塞
有时候子进程会因为等待标准输入、输出或错误流的处理而提前终止,把这些流重定向到/dev/null或者文件就能解决这个问题:
import subprocess import os # 把stdout、stderr重定向到/dev/null,同时关闭stdin with open(os.devnull, 'w') as devnull: subprocess.Popen( ["sleep", "10"], stdout=devnull, stderr=devnull, stdin=subprocess.DEVNULL )
这样子进程就不会因为IO挂起而意外终止,能安安稳稳跑完任务。
方案3:结合shell的
nohup命令 如果你习惯用shell的nohup来后台运行任务,也可以直接在subprocess里调用它:
import subprocess # 非shell模式调用nohup subprocess.Popen(["nohup", "sleep", "10", "&"], shell=False) # 或者用shell模式(注意shell=True的安全风险) subprocess.Popen("nohup sleep 10 &", shell=True)
nohup本身就是用来让进程忽略挂起信号、后台运行的工具,和subprocess搭配刚好能满足你的需求。
Windows平台的特殊处理
如果是在Windows上,上面的类Unix方法不适用,需要用CREATE_NEW_PROCESS_GROUP创建独立进程组:
import subprocess import sys if sys.platform == 'win32': # 用timeout模拟sleep的效果 subprocess.Popen( ["timeout", "10"], creationflags=subprocess.CREATE_NEW_PROCESS_GROUP )
这个标志会让子进程在新的进程组中运行,主进程退出后它依然能继续执行。
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

