subprocss常用参数

概要

本文用来记录使用subprocess库时遇到的各个参数以及讲解

命令示例(linux下)

subprocess.Popen(record_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, start_new_session=True, executable='bash')

需要记录的是其中的 start_new_session与 executable

start_new_session

该参数设置为True时,会让 Popen 成立自己的进程组,即该命令派生出来的子进程都会属于同一个进程组,但是在linux环境下会发现,当设置shell=True后有时候执行一条命令,通过ps命令查看却有两个进程产生,发送 p.terminate() 仍然只会杀死本身一个进程,还会有一个进程无法一起杀死,下面会有解释可以使用executable参数只生成一个进程。

另:如果只是想直接杀死整个进程组,可以使用os.killpg,例如下面命令

os.killpg(os.getpgid(self.record_pid), 9)

executable

当设置shell=True后executable可指定执行环境,通常写为bash,如果不写该参数,会发现执行命令通常会产生两个进程,并且无法使用terminate()同时杀死,原因大概如下,https://stackoverflow.com/questions/3468922/python-why-does-subprocess-start-2-processes-in-ubuntu-and-1-in-opensuse,shell=True情况下默认使用sh -c "string"来执行命令,这通常会产生两个进程,所以最好直接指定为bash执行。

p.terminate() 与 p.kill()

windows环境下terminate()与kill()方法一样,在windows中彻底杀死进程的方法在另一篇文章中有提到;

在linux中两种方法是发送不同的信号,推荐使用terminate(),某些命令看起来执行terminate后会执行命令后置对应操作(比如录制视频,如果用kill,进程直接就消失,视频文件也无法正常打开)。

这两种信号的区别可以参考

https://www.cnblogs.com/alexyuyu/articles/3853583.html

 

posted @ 2021-12-27 13:48  风,又奈何  阅读(45)  评论(0编辑  收藏  举报