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