os.popen
os.popen() 是 os 模块内置的“管道”函数,包含了上面两个方法的所有功能,并且可以获得命令/可执行文件的标准输入和输出。
这在需要 Python 编程来控制命令的执行情况,就显的很有意义了,比如执行一个可执行文件来监测服务器是否启动,只有在服务器启动后,才能执行第二个程序,来启动所有服务。这就需要判断一个子进程执行的结果。
格式os.popen(command [, mode='r' [, bufsize]]) -> pipe
说明:command:命令,或一个可执行文件的全路径
mode: 模式,模式址 'r' 只读
bufsize: 内容的缓存区大小
返回值是一个“管道”,在 Linux 系统下也可以称之为“文件对象/文件描述符“。
范例>>> import os
>>> stdout = os.popen('echo "Fuvism"', 'r')
>>> print stdout
返回了一个只读的 file 对象,可以读出命令的执行结果。
获取命令/可执行文件的输出内容:>>> print stdout.read()
Fuvism
>>> stdout.close()
可写模式:
>>> import os
>>> stdin = os.popen('cat -', 'w')
>>> print stdin
返回了一个可写的 file 对象,通过写入内容 "Fuvism",给命令 cat - 来提供输出的内容。
写入内容:>>> stdin.write('\tFuvism\t')
>>> stdout.close()
Fuvism
使用
就像文件描述符的使用过程一样,也需要在使用后关闭:>>> stdout.close()
os.open2() 可以同时提供标准输入和输出:
>>> stdin, stdout = os.popen2('cat -')
>>> stdin.write('\tFuvism\t')
>>> stdin.close()
>>> print stdout.read()
>>> stdout.close()
上面是捕获输出(在这里的文件描述符中,也称之为“标准输出”),还可以通过 open3() 捕获标准错误,也就是可以通过是否有标准错误,来判断命令是否执行成功:>>> stdin, stdou, stderr = os.popen3('cat -; echo "Fuvism Error" 1>&2')
>>> stdin.write('\tFuvism\t')
>>> stdin.close()
>>> print stdout.read()
>>> stdout.close()
>>> print stderr.read()
>>> stderr.close()
每个都需要单独关闭 close(),如果程序报错,则 stderr 将可以通过 read() 获取错误内容。
大多数情况下需要同时访问 stdout 和 stderr
特点
尽管 popen 也能在 windows 上使用,但是不能在 windows 环境直接调用 Linux 相关的命令。
描述中的术语(Unix中通用):
stdin - 进程的“标准输入”流(文件描述符0)
stdout - 进程的“标准输出”流(文件描述符1)
stderr - 进程的“标准错误”流(文件描述符2)