同福

Python调用外部命令的技巧V1.2【20210812】

介绍

介绍

我们使用 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"))

home/topic/2021/0813/13/900dbf41c9577aa556c7759634ebb9bc.png

总结

  • subprocess 模块功能更强大,推荐使用

  • 如果简单调用,不考虑执行失败的情况的话,可以考虑使用 os 模块