场景
使用 Python 执行 Shell 命令(或者脚本),有两种执行场景:
等待,直到命令执行完毕,一次性获取返回结果,做一些你想做的事情;
命令执行的同时,实时获取命令的持续输出,做一些你想做的事情。
例子
第一种场景: (list segment,Unix系统中使用非常频繁的命令)用于列出所有文件,文件列出之后就自动退出了。
第二种场景: 它会持续的输出结果,并不会退出(当然可以加 来指定 n 次之后结束退出,这样就属于场景一了,本文我们不指定 n)
相信这两种情况已满足了读者 90% 呃不 100% 需求了,如果没有请留言区留言
预备
执行一个 Shell 命令行时通常会自动打开三个标准文件,即:
标准输入文件(stdin),通常对应终端的键盘
标准输出文件(stdout)
标准错误输出文件(stderr)
后两个文件对应终端的屏幕,进程从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
实战
比较一下比较好记忆:
(场景一)
两个点比较有价值:
shell 这个参数很多人不理解,其实就是 False 的时候 Python 帮你执行命令, True 的时候相当于直接在终端执行命令。False 的时候,我们需要把命令按空格使用逗号分隔开来(即 list 数据结构)传给 cmd 参数(目的是让 Python 清楚这条命令的所有细节),代码中的例子就是使用这种;而 True 的时候只需要把命令一股脑(string 数据结构)的传给 cmd 参数,总结即 False:,True: 纠结吗?推荐第一种
这个方法到底是干嘛的?官方文档如下:
Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child.
communicate() returns a tuple (stdout, stderr).
翻译一下:
与进程进行交互:将数据发送到 stdin。从 stdout 和 stderr 文件中读取数据,直到达到文件结尾。等待进程终止。可选的 参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则为 None。
communicate() 返回一个元组 (stdout, stderr)。
例子中我们并没有显式的指定 input 参数,默认为 None,我们只从 stdin 和 stderr 文件中读取数据。
这里其实是一个同步的过程,进程终止后才会返回所读取到的数据(进程终止,文件自然也结尾了),也就是 方法直接使命令执行变为了同步,不执行完成就一直阻塞。如果我们执行 等不会自己终止的命令,这种方式会一直卡死,因为进程一直没有结束,文件也一直不会结尾。
那么类似这种持续输出结果的命令如何执行呢?我们接着向下看
(场景二)
如代码所示,少了 ,于是 p 是 类的实例
查看 Popen 类源码 738 行:
从 的文档:
Return an open file object connected to a file descriptor.
得知 是一个:打开的文件对象,那么用 就合理了。
注意这里使用了 内置函数,将 转换为一个迭代器,并使用 替换迭代器的 方法,后面 的意思就是当 返回的值是 的时候,迭代器终止,本篇不详细讲,有兴趣可以留言提问哦
领取专属 10元无门槛券
私享最新 技术干货