python调用shell方法总结

参考地址:https://www.cnblogs.com/wrxblog/p/9752412.html

https://www.cnblogs.com/hei-hei-hei/p/7216434.html

http://www.cnblogs.com/yangykaifa/p/7127776.html

 

一、使用os模块:

os.system()

os.system("The command you want").
这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。执行后返回的是程序执行的状态0或者1

os.popen(command[,mode[,bufsize]])

popen方法可以得到shell命令的返回值。os.popen(cmd)后,须要再调用read()或者readlines()这两个命令,输出结果。

通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值)

os.popen()  #返回的是 file read 的对象,但没有状态码
a=os.popen("df -hT | awk 'NR==3{print $(NF-1)}'").read() #返回的是字符串;
a=os.popen("df -hT | awk 'NR==3{print $(NF-1)}'").readlines()  #返回的是列表.
a
=os.popen("ls","r").read()
a.close() #popen需要关闭close().当执行成功时,close()不返回任何值,失败时,close()返回系统返回值

二、使用commands模块(commands适用于Python2)

使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个文件句柄,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。
主要方法:

commands.getstatusoutput(cmd) 返回(status, output)
commands.getoutput(cmd) 只返回输出结果
commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法

commands.getstatusoutput('ls /bin/ls')  #返回(status和output)如(0, '/bin/ls')
commands.getoutput('ls /bin/ls')   # 返回命令的输出结果
commands.getstatus('log')    # 调用commands.getoutput中的命令对'log'文件进行相同的操作 

commands模块有三个方法可供选择。getstatusoutput, getoutput, getstatus。

但是,如上三个方法都不是Python推荐的方法,而且在Python3中其中两个已经消失。Python文档中目前全力推荐第四个方法,subprocess!

三、subprocess适用于Python3

根据Python官方文档说明,subprocess模块用于取代上面这些模块。
subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)

subprocess.call(["some_command","some_argument","another_argument_or_path"])
subprocess.call(command,shell=True)
subprocess.Popen(command,shell=True)

假设command不是一个可运行文件。shell=True不可省,shell=True意思是shell下运行command。。
使用subprocess模块能够创建新的进程,能够与新建进程的输入/输出/错误管道连通。并能够获得新建进程运行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。

 

call--执行命令,返回状态码(命令正常执行返回0,报错则返回1);

check_call--执行命令,如果执行成功则返回状态码0,否则抛异常;
check_output--执行命令,如果执行成功则返回执行结果,否则抛异常;
Popen--用于执行复杂的系统命令,
subprocess.call(["ls","-l"],shell=Ture)  #执行成功后,返回状态码0或者1
subprocess.output(["echo","helloworld"])   #返回程序执行的返回结果

 

posted @ 2019-02-17 18:37  远洪  阅读(2430)  评论(0编辑  收藏  举报