subprocess: Popen
前面使用快捷的 subprocess 函数,它们都是 Popen 类的包装器,直接使用 Popen 会对如何运行命令,以及如何处理输入和输出流有更好,更多的控制。
1. 单向通信(只读,只读取输出)
运行一个进程并读取他的所有输出,可以设置 Popen 的 stdout 为 subprocess.PIPE,并且通过调用 communicate() 获取输出:import subprocess
pp = subprocess.Popen(['echo', '"Fuvism"'],
stdout=subprocess.PIPE,
)
stdout = pp.communicate()[0]
print 'stdout: ', stdout
输出stdout: "Fuvism"
2. 双向通信(读写,还能给命令提供额外的输入)import subprocess
pp = subprocess.Popen(['cat', '-'],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
)
msg = 'Fuvism'
stdout = pp.communicate(msg)[0]
print 'stdout: ', stdout
其中 communicate() 多了一个参数 msg,这个参数是我们“写入”命令的内容,可以是任意内容
输出:stdout: "Fuvism"
3. 捕获错误import subprocess
pp = subprocess.Popen(['cat', '-'],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
)
msg = 'Fuvism'
stdout, stderr = pp.communicate(msg)
print 'stdout: ', stdout
print 'stderr: ', stderr
输出stdout: "Fuvism"