如何使用Python中的commands模块获取系统命令的输出结果
Python中的commands模块已经在Python 2.6版本中被弃用了,取而代之的是subprocess模块。subprocess模块提供了更全面和强大的功能来执行系统命令和处理命令的输出结果。下面我将介绍如何使用subprocess模块来获取系统命令的输出结果,并给出几个使用示例。
首先,需要导入subprocess模块:
import subprocess
获取系统命令的输出结果有两种方式:一种是获取命令的标准输出结果(stdout),另一种是获取命令的错误输出结果(stderr)。下面分别介绍这两种方式的使用。
### 获取标准输出结果
可以使用subprocess模块中的check_output函数来获取命令的标准输出结果。这个函数会在子进程完成之后返回子进程的标准输出结果。
下面是一个简单的示例,演示如何使用check_output函数来执行ls命令并获取其输出结果:
output = subprocess.check_output(['ls']) print(output)
在这个示例中,check_output函数接受一个列表作为参数,列表中的每个元素都是命令的一部分。在这个示例中,命令只有一个部分,即ls。执行完命令之后,check_output函数会返回命令的标准输出结果,并将其赋值给output变量。最后,将output打印出来。
### 获取错误输出结果
如果需要获取命令的错误输出结果,可以使用subprocess模块中的check_output函数的stderr参数。这个参数可以指定将错误输出结果重定向到标准输出结果中。
下面是一个示例,演示如何使用check_output函数来执行ls -laaa命令并获取其错误输出结果:
try:
subprocess.check_output(['ls', '-laaa'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print("Command '{}' returned with error (code {}):".format(e.cmd, e.returncode))
print(e.output)
在这个示例中,check_output函数接受一个列表作为参数,列表中的 个元素是命令的一部分,第二个元素是命令的参数。这个命令是错误的,因为ls命令没有-laaa这个参数。通过指定stderr=subprocess.STDOUT,将错误输出结果重定向到标准输出结果中。如果命令执行失败,会抛出CalledProcessError异常,可以通过这个异常获取到命令的错误输出结果。
在上面的示例中,当命令执行失败时,会打印错误信息,包括命令、错误代码和错误输出结果。
### 运行带有管道的命令
subprocess模块还可以处理包含管道符的命令,即将多个命令通过管道符连接起来。下面是一个示例,演示如何使用subprocess模块来执行带有管道的命令:
p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) p2 = subprocess.Popen(['grep', '.py'], stdin=p1.stdout, stdout=subprocess.PIPE) output = p2.communicate()[0] print(output)
在这个示例中,首先通过Popen函数创建一个ls命令的子进程(p1),将其标准输出结果重定向到管道(stdout=subprocess.PIPE)。然后,通过Popen函数创建一个grep命令的子进程(p2),将其标准输入结果与p1的标准输出结果相连接(stdin=p1.stdout),将p2的标准输出结果重定向到管道(stdout=subprocess.PIPE)。最后,通过communicate方法获取到p2的标准输出结果,并将其打印出来。
在上面的示例中,ls命令的标准输出结果被grep命令过滤,只返回包含.py的结果。
### 使用shell执行命令
如果想要使用shell来执行命令,可以使用subprocess模块的call函数或check_output函数,并指定shell=True。
下面是一个示例,演示如何使用check_output函数来使用shell执行命令:
output = subprocess.check_output('ls | grep .py', shell=True)
print(output)
在这个示例中,'ls | grep .py'是一个使用shell执行命令的字符串。通过设置shell=True,将命令字符串作为一个整体来执行。
### 结论
以上是使用subprocess模块获取系统命令的输出结果的一些示例。subprocess模块提供了非常强大和灵活的功能,可以方便地执行和处理系统命令。希望这些例子能够帮助你理解如何使用subprocess模块获取系统命令的输出结果。
