我们使用 python 替代 shell 是因为 python 更强大,但是shell就是linux,shell调用系统命令直接就可以
那么 python 如果调用系统命令呢?
标准输出stdout通过readlines()方法得到数组
import os
fd = os.popen('ls')
print (fd.readlines())
fd.close()标准输出stdout会直接打印出来,返回结果码
import os
retcode = os.system('ls')
print (retcode)运行命令,打印标准输出stdout
import subprocess p = subprocess.Popen(args='ls -lh',shell=True,cwd='/root') p.wait()
运行命令,将标准输出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 模块