python subprocess模块调用shell命令
2019-02-11 本文已影响0人
ScienBeast
简介
python中的subprocess模块已经开始代替os模块(os.system,os.spawn,os.popen,popen2.,commands.)调用shell命令,并与之进行信息通信。subprocess模块可以生成新的进程执行shell命令,并与标准输入,输出,错误输出管道通信。
先来看个简单例子,Popen是一个封装类,Popen中第一个参数是shell命令(list格式),第二个和第三个参数分别为标准输出和错误
#!/usr/bin/env python
from subprocess import Popen, PIPE
process = Popen(['cat', 'test.py'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
print stdout
process.communicate()函数会从进程中读取shell命令的标准输出和返回的错误,如果要等待子进程执行完成需要加上Popen.wait().
Subprocess call()
subprocess有个call方法可以调用shell命令
用法:subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
实例:
#!/usr/bin/env python
import subprocess
ret = subprocess.call(["ls", "-l"])
print "return value is : %d"%ret
-----------------------------------------------------
total 4
drwxr-xr-x 2 root root 6 Feb 11 16:27 cloudfront-record
drwx------ 3 root root 16 Nov 13 13:46 systemd-private-076a135c402143f78c1000cee846fa41-ntpd.service-AFBhcj
-rw-r--r-- 1 root root 112 Feb 11 17:38 test.py
return value is : 0
我们可以看到执行正确时返回结果为0, call()方法不能获取输出结果
process output
check_output()方法可以获取执行结果
用法 subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
实例:
#!/usr/bin/env python
import subprocess
ret = subprocess.check_output(["echo", "hello world"])
print("return value = " + ret)
--------------------------------------------------------------------
return value = hello world