它会返回一个元组:(stdoutdata, stderrdata)
subprocess还有另一种更简单方法,效果一样,它会返回stdout
>>> s = subprocess.check_output('ls -l', shell=True)
>>> s
'xe6x80xbbxe7x94xa8xe9x87x8f 152n-rw------- 1 limbo limbo 808 7xe6x9cx88 6 17:46 0000-00-00-welcome-to-jekyll.markdown.erbndrwx------ 2 limbo limbo 4096 8xe6x9cx88 15 18:43 argndrwx------ 2 limbo limbo 4096 8xe6x9cx88 7 17:37 argvndrwxrwxr-x 2 limbo limbo 4096 9xe6x9cx88 10 15:27 cndrwxrwxr-x 3 limbo limbo 4096 9xe6x9cx88 11 14:35 d3ndrwxrwxr-x 3 limbo limbo 4096 9xe6x9n'
前者可以实现更多的交互,如stderr和stdin,但是在前面调用Popen的时候要实现定义Popen(stdin=subprocess.PIPE, stderr=subprocess)
给子进程输入
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
()不为空,则写入subprocess.PIPE,为空,则从subprocess.PIPE读取
subprocess.PIPE
#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
实际上是这样的过程
child1.stdout-->subprocess.PIPE
child2.stdin<--subprocess.PIPE
child2.stdout-->subprocess.PIPE
要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
subprocess.PIPE实际上为文本流提供一个缓存区。直到communicate()方法从PIPE中读取出PIPE中的文本.要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。










