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 的执行时间

Python多进程 - subprocess & multiprocess

从 async.subprocess.PIPE 读取

subprocess.Popen 和缓冲的进程输出

Python 之 subprocess模块

python subprocess.getoutput函数