subprocess最先在2.4版本引入。用来生成子进程,并能够经过管道链接他们的输入/输出/错误,以及得到他们的返回值。html
# subprocess用来替换多个旧模块和函数 os.system os.spawn* os.popen* popen2.* commands.*
运行python的时候,咱们都是在建立并运行一个进程,linux中一个进程能够fork一个子进程,并让这个子进程exec另一个程序。在python中,咱们经过标准库中的subprocess包来fork一个子进程,而且运行一个外部的程序。subprocess包中定义有数个建立子进程的函数,这些函数分别以不一样的方式建立子进程,因此咱们能够根据须要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通讯。python
1. calllinux
执行命令,返回状态码,shell = True容许shell命令时字符串形式shell
subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True)
2. check_callwindows
执行命令,若是执行状态码是0,则返回0,不然抛出异常函数
subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True)
3. check_output工具
执行命令,若是状态码是0,则返回执行结果,不然抛出异常ui
subprocess.check_output(["echo", "Hello World!"]) subprocess.check_output("exit 1", shell=True)
4. subprocess.Popen(...) spa
用于执行复杂的系统命令.net
参数:
执行普通命令:
import subprocess ret1 = subprocess.Popen(["mkdir","t1"]) ret2 = subprocess.Popen("mkdir t2", shell=True)
终端输入的命令分为两种:
import subprocess obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj.stdin.write("print(1)\n") obj.stdin.write("print(2)") obj.stdin.close() cmd_out = obj.stdout.read() obj.stdout.close() cmd_error = obj.stderr.read() obj.stderr.close() print(cmd_out) print(cmd_error)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj.stdin.write("print(1)\n") obj.stdin.write("print(2)") out_error_list = obj.communicate() print(out_error_list)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out_error_list = obj.communicate('print("hello")') print(out_error_list)