Python3运行shell命令

在Python中,我们可以使用subprocess模块来运行shell命令。subprocess模块提供了一种简单而强大的方法来与操作系统的shell进行交互,并在Python程序中执行命令。

1. subprocess模块简介

Python的subprocess模块允许我们在Python程序中创建新的进程,连接其输入/输出/错误管道,并获取执行结果。它提供了多种方法来运行shell命令,例如subprocess.call()subprocess.check_output()等。

2. 使用subprocess运行shell命令

2.1 subprocess.call()

subprocess.call()方法用于运行shell命令,并等待命令完成后返回状态码。下面是一个简单的示例,演示如何使用subprocess.call()运行ls命令:

import subprocess

subprocess.call(["ls", "-l"])

在上面的示例中,["ls", "-l"]是一个命令及其参数的列表。subprocess.call()方法会将该命令传递给操作系统的shell执行,并等待其完成。执行完毕后,subprocess.call()会返回进程的退出状态码。

2.2 subprocess.check_output()

subprocess.check_output()方法用于运行shell命令,并返回命令的输出结果。下面是一个示例,演示如何使用subprocess.check_output()运行ls命令并获取输出:

import subprocess

output = subprocess.check_output(["ls", "-l"])
print(output.decode("utf-8"))

在上面的示例中,output变量保存了ls -l命令的输出结果。由于check_output()方法返回的是字节流(bytes),我们需要使用decode()方法将其转换为字符串。

3. 运行带有参数的shell命令

有时候,我们需要运行带有参数的shell命令。下面是一个示例,演示如何使用subprocess.call()运行带有参数的命令:

import subprocess

subprocess.call("echo Hello, World!", shell=True)

在上面的示例中,shell=True表示我们希望将命令传递给shell来执行。这样,我们就可以像在shell中一样使用命令和参数。

4. 捕获命令的输出和错误信息

除了获取命令的输出结果,subprocess模块还可以捕获命令的错误输出。下面是一个示例,演示如何使用subprocess.check_output()获取命令的输出和错误信息:

import subprocess

try:
    output = subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)
    print(output.decode("utf-8"))
except subprocess.CalledProcessError as e:
    print("命令执行失败:", e.output.decode("utf-8"))

在上面的示例中,我们使用try-except语句来捕获subprocess.check_output()可能抛出的CalledProcessError异常。e.output保存了命令的错误输出。

5. 非阻塞方式运行shell命令

有时候,我们希望以非阻塞的方式运行shell命令,即不等待命令完成就继续执行后续代码。subprocess模块提供了subprocess.Popen()方法来实现这个功能。下面是一个示例,演示如何以非阻塞方式运行shell命令:

import subprocess

p = subprocess.Popen(["ls", "-l"])

在上面的示例中,subprocess.Popen()方法会立即返回一个Popen对象,该对象可以用于后续操作,例如等待命令完成、获取命令的输出等。

6. 总结

这篇文章介绍了如何在Python3中使用subprocess模块运行shell命令。我们学习了subprocess.call()subprocess.check_output()方法的用法,并了解了如何处理命令的输出和错误信息。此外,我们还学习了如何以非阻塞方式运行shell命令。

subprocess模块是Python中运行shell命令的强大工具