python引入subprocess模块来管理子进程,主要是执行系统命令。
subprocess不但可以通过命令fork一个子进程,还可以连接到子进程的input、output、error管道,信息互动。
一、执行简单的系统命令,不含参数
(一)subprocess.check_output() 创建子进程:状态码为0表示成功,返回执行结果;否则抛出异常。
(二)subprocess.check_call() 创建子进程:状态码为0表示成功,返回0;否则抛出异常。
(三)subprocess.call() 创建子进程,状态码为0表示成功,返回0;否则抛出异常。

import subprocess # 简单的命令,不含参数的 # 1、call执行命令,不返回执行结果 # 执行成功,返回状态码0;否则抛出异常 ret = subprocess.call('ipconfig') print(ret) # output:0 # 2、check_output执行命令,成功返回执行结果;否则抛出异常 try: ret = subprocess.check_output('ipconfig',shell=True) print(ret) except Exception as e: print('执行失败!') # 3、check_call执行命令,成功返回状态码0;否则抛出异常 try: ret = subprocess.check_call('ipconfig') print(ret) except Exception: print('执行失败!')
注意:参数shell,默认False:以序列形式输入多条命令;=True时,以字符串形式输入多条命令。
二、Popen执行复杂的系统命令,可以信息互动
(一)Popen执行简单系统命令

# 参数shell # shell=False,默认,以列表形式输入 ret = subprocess.Popen(["python","input","hello"]) print(ret) # <subprocess.Popen object at 0x02143670> # shell=True ,以字符串形式输入 ret = subprocess.Popen('python input hello',shell=True) print(ret) # 参数cwd,先跳转至路径,再执行命令 subprocess.Popen(["mkdir test"],shell=False,cwd='c:/')
注意:参数cwd。可先跳转至cwd指定目录,再执行命令。
(二)Popen执行复杂的系统命令

# Popen执行复杂命令,并与子进程进行交互 # 需要向子进程发送数据,在创建对象的时候,stdin设置为PIPE; # 需要从stdout或stderr获取数据,相应的stdout、stderr设置为PIPE。 # 创建Popen对象,打开python解释器 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) # # 传递信息给子进程,方式二 cmd_out,cmd_error = obj.communicate('print("hi")') print(cmd_out,cmd_error) # obj.communicate()返回一个元组(stdoutdata、stderrdata)
注意:信息交互,需要调用输入、输出和错误信息管道,在创建对象时,需要配置PIPE。