介绍
介绍
我们使用 python 替代 shell 是因为 python 更强大,但是shell就是linux,shell调用系统命令直接就可以
那么 python 如果调用系统命令呢?
教程
使用 os 模块
获取标准输出
标准输出stdout通过readlines()方法得到数组
import os fd = os.popen('ls') print (fd.readlines()) fd.close()
获取结果码
标准输出stdout会直接打印出来,返回结果码
import os retcode = os.system('ls') print (retcode)
使用 subprocess 模块
直接运行
运行命令,打印标准输出stdout
import subprocess p = subprocess.Popen(args='ls -lh',shell=True,cwd='/root') p.wait()
输出放入PIPE
运行命令,将标准输出stdout放入PIPE
import subprocess p = subprocess.Popen(args='ls -lh',stdout=subprocess.PIPE,shell=True,cwd='/root') p.wait() print (p.stdout.read())
获取结果码
运行命令,打印标准输出stdout,返回结果码
import subprocess retcode = subprocess.call('ls -lh /root/',shell=True) print (retcode)
获取结果码(带检测)
如果执行失败,会触发 CalledProcessError 异常
import subprocess retcode = subprocess.check_call('ls -lh /root/sfc',shell=True) print (retcode)
获取标准输出(带检测)
如果执行失败,会触发 CalledProcessError 异常
import subprocess output = subprocess.check_output('ls -lh /root/sfc',shell=True) print (output)
获取结果码和标准输出
前面给出的方案都是要不只能获得状态码,要不只能获取标准输出,如果我们想即得到状态码又获取标准输出怎么办?下面福哥给出一个例子可以达到这个目的。
fo = subprocess.Popen("dir D:\\TFAPI\\Python38", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) allStdouts = [] allStderrs = [] while True: lines = fo.stdout.readlines() for d in range(0, len(lines)): allStdouts.append(lines[d].strip()) lines = fo.stderr.readlines() for d in range(0, len(lines)): allStderrs.append(lines[d].strip()) retCode = fo.poll() if retCode is not None: break for d in range(0, len(allStdouts)): print(allStdouts[d].decode("gbk")) for d in range(0, len(allStderrs)): print(allStderrs[d].decode("gbk"))
总结
subprocess 模块功能更强大,推荐使用
如果简单调用,不考虑执行失败的情况的话,可以考虑使用 os 模块