Python之subprocess模块的使用

来源:互联网 发布:在家英文网络客服 编辑:程序博客网 时间:2024/06/06 01:19

详细可参考Python的subprocess模块

subprocess.Popen

class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

用法: args可以是list,也可以是str(shell=True时)

child = subprocess.Popen(['ping','-c','4','www.baidu.com'])

Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用child.wait()方法,父进程才会等待。

有三个简便的方法,参数和Popen一样。

subprocess.call()subprocess.check_call()subprocess.check_output()

实际上,上面的几个函数都是基于Popen()的封装,不同的是这三者都会等待子进程完成。成功则返回0。
对于check_call()check_output(),当returncode不是0时,会触发subprocess.CalledProcessError异常,该对象包含有returncode属性和output属性(check_output()独有)。

杀死创建的进程

child.kill()child.terminate()

注意,当shell=True时,Popen会使用shell来执行命令(Windows对应cmd.exe,Linux对应/bin/sh),所以child.pid返回的其实是shell的PID。

对于Windows:

child = subprocess.Popen('ping -c4 www.baidu.com',shell=True)subprocess.call(['taskkill', '/F', '/T', '/PID', str(child.pid)])

对于Linux:

child= subprocess.Popen('ping -c4 www.baidu.com', shell=True, preexec_fn=os.setsid) os.killpg(os.getpgid(child.pid), signal.SIGTERM)

参考StackOverflow