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"]) #返回程序执行的返回结果