subprocess
Posted zhming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了subprocess相关的知识,希望对你有一定的参考价值。
python2.x 中使用os 模块来在执行系统命令。
其中两个方法值得关注
os.sys(‘df -h‘)
os.Popen(‘df -h‘)
其中os.sys() 最终返回的是执行命令的成功与否的状态
而os.Popen() 就相当于开启了一个临时文件,把执行结果放到这个临时文件中。于是你想得到执行结果就需要os.Popen(‘df -h‘).read()
python3.x 中执行系统命令就不要再用os模块了,因为有subprocess模块,必定人要往前看,别用一些过时的技术。
subprocess模块怎么使用,详细的你去搜,我这就是一个常用的,方法如下:
>>>command_exec_result = subprocess.Popen(‘df -lh‘,shell=True,stdout=subprocess.PIPE).stdout.read() >>> print(command_exec_result.decode()) Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1 465Gi 273Gi 191Gi 59% 1325893 4293641386 0% /
来解释下:
1. subprocess.Popen(‘df -lh‘,shell=True)这样就执行了。但不能通过这个.read()来获取结果。为什么呢?
因为上面的命令,就相当于你在python中调用subprocess模块下的Popen方法,这个方法得到‘df -lh‘和 shell=True两个参数,接下来它就开启了一个linux子进程, 我们知道进程 和子进程是不能访问共享数据的。所以你不能直接通过.read()获取结果。
那么怎么获得呢?我们在shell环境中经常使用管道符号“|”获取一个命令的结果传给下一个命令。这里:subprocess.Popen(‘df -lh‘,shell=True,stdout=subprocess.PIPE) 中的stdout=subprocess.PIPE 就是管道。这里是stdout,还有stderr但是不常用。
2.print(command_exec_result.decode())这里为什么command_exec_result.decode(),因为在python3中用subprocess执行的结果是bytes,用decode()方法获取string.
这里扩展一个小知识:
python2.x中 bytes 和 string没有啥区别。
python3.x中bytes和string就区分了。并且python3.x默认用的字符编码是utf-8,所以默认支持中文。
字符串.encode()是将string转换成bytes
b‘ss‘.decoude()是将bytes转换成了utf-8编码形式的字符串。
完
以上是关于subprocess的主要内容,如果未能解决你的问题,请参考以下文章
查找 subprocess.Popen python 的执行时间