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('执行失败!')
View Code

  注意:参数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:/')
View Code

  注意:参数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)
View Code

  注意:信息交互,需要调用输入、输出和错误信息管道,在创建对象时,需要配置PIPE。