Python 子进程命令执行神器: subprocess.run()、subprocess.Popen() 和 subprocess.check_output()
2023-07-13 12:04:49
子进程:利用 Python 有效执行系统命令
引言
在 Python 中处理系统命令时,subprocess
模块提供了强大的工具集。它使我们能够执行命令、启动新进程并与之交互。本文深入探讨了 subprocess
中三个关键函数,即 subprocess.run()
, subprocess.Popen()
, 和 subprocess.check_output()
,指导你了解它们的用法和区别。
1. subprocess.run():简单高效的命令执行
subprocess.run()
是一款易于使用的函数,只需传入要执行的命令即可。它负责执行命令并返回结果。示例如下:
import subprocess
result = subprocess.run("ls -l", capture_output=True)
print(result.stdout)
这段代码执行了 "ls -l" 命令,捕获其输出并将其打印到控制台上。subprocess.run()
函数还允许你自定义子进程的行为,例如检查其成功执行 (check=True
) 或限制其执行时间 (timeout
)。
2. subprocess.Popen():灵活的子进程控制
subprocess.Popen()
是一款功能更强大的函数,提供了更多控制子进程的选项。它允许你启动新进程并将其与父进程的输入/输出管道连接。例如,我们可以使用 subprocess.Popen()
将数据发送到子进程:
import subprocess
process = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write(b"print('Hello, world!')\n")
process.stdin.close()
output = process.stdout.read()
print(output.decode())
在这段代码中,我们启动了一个新的 Python 解释器进程,发送数据 "Hello, world!",然后读取子进程的输出。
3. subprocess.check_output():专注于输出结果
subprocess.check_output()
专注于获取子进程的输出结果。它执行命令并返回其输出,而不会抛出异常。当我们只想获取结果时,这是一个有用的选项:
import subprocess
output = subprocess.check_output("ls -l")
print(output.decode())
这段代码执行了 "ls -l" 命令并打印其输出。subprocess.check_output()
省去了对子进程执行状态的检查。
4. subprocess.run()、subprocess.Popen() 和 subprocess.check_output() 的区别
尽管这些函数都用于执行命令,但它们有一些关键区别:
- subprocess.run() 简单易用,提供对子进程行为的全面控制。
- subprocess.Popen() 灵活且强大,允许你连接输入/输出管道和启动新进程。
- subprocess.check_output() 仅关注输出结果,省去了对子进程执行状态的检查。
5. 总结
subprocess
模块中的这三个函数为有效处理系统命令提供了不同的选项。subprocess.run()
适用于简单命令执行,subprocess.Popen()
提供了更高级别的控制,而 subprocess.check_output()
专注于获取输出结果。通过了解这些函数的区别,你可以选择最适合你任务的函数。
常见问题解答
- 如何检查子进程是否成功执行?
使用subprocess.run()
中的check=True
参数或subprocess.Popen()
中的wait()
方法。 - 如何限制子进程的执行时间?
使用subprocess.run()
中的timeout
参数。 - 如何从子进程获取输出?
使用subprocess.run()
的stdout
属性或subprocess.Popen()
的communicate()
方法。 - 如何将数据发送到子进程?
使用subprocess.Popen()
中的stdin
属性。 - 何时应该使用
subprocess.check_output()
?
当你只想获取命令的输出结果,而不关心其执行状态时。