一、subprocess
模块概述
subprocess
模块允许你启动新的应用程序,连接到它们的输入/输出/错误管道,并获取它们的返回码。这个模块提供了一个高级接口来创建和管理子进程,并收集它们的输出。
二、subprocess.run()
方法
subprocess.run()
是一个高级函数,用于运行命令并等待完成,然后返回一个CompletedProcess
实例。
示例代码:
import subprocess
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print("Return code:", result.returncode)
print("Output:", result.stdout)
print("Error:", result.stderr)
解释:
- 我们首先导入了
subprocess
模块。 - 使用
subprocess.run()
方法运行了ls -l
命令(在Unix/Linux系统上列出当前目录的内容)。 capture_output=True
参数告诉run()
方法捕获命令的输出。text=True
参数确保输出作为字符串返回,而不是字节串。result
是一个CompletedProcess
实例,它包含了命令的返回码、标准输出和标准错误输出。
三、subprocess.Popen()
方法
subprocess.Popen()
是一个更底层的函数,用于启动子进程,并返回一个Popen
对象,你可以使用这个对象与进程交互。
示例代码:
import subprocess
process = subprocess.Popen(["ping", "-c", "4", "www.google.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print("Return code:", process.returncode)
print("Output:", stdout)
print("Error:", stderr)
解释:
- 我们使用
subprocess.Popen()
方法启动了一个ping
命令,该命令向www.google.com
发送了4个ICMP回显请求。 stdout=subprocess.PIPE
和stderr=subprocess.PIPE
参数告诉Popen()
方法我们想要捕获命令的标准输出和标准错误输出。text=True
参数确保输出作为字符串返回。process
是一个Popen
对象,它代表了我们启动的子进程。- 我们使用
process.communicate()
方法等待进程完成,并获取其标准输出和标准错误输出。这个方法会阻塞,直到进程完成。 - 最后,我们打印了进程的返回码、标准输出和标准错误输出。
四、communicate()
方法
communicate()
是Popen
对象的一个方法,用于与进程交互。你可以向进程发送输入,并获取其输出。但是,请注意,你只能调用communicate()
方法一次,因为进程的标准输入、标准输出和标准错误输出管道在调用后会被关闭。
示例代码(向进程发送输入):
import subprocess
process = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
input_data = "Hello, subprocess!\n"
stdout, stderr = process.communicate(input=input_data)
print("Return code:", process.returncode)
print("Output:", stdout)
解释:
- 我们使用
subprocess.Popen()
方法启动了一个cat
命令,该命令通常用于显示文件的内容。但是在这里,我们没有指定要显示的文件,所以它会等待从标准输入读取数据。 - 我们通过
communicate(input=input_data)
方法向进程发送了输入数据。注意,这里的输入数据是一个字符串,末尾有一个换行符,因为cat
命令期望以换行符结束输入。 - 我们再次使用
communicate()
方法获取进程的标准输出。但是这次我们没有向进程发送任何输入(因为input
参数是可选的,并且默认为None
)。 - 最后,我们打印了进程的返回码和标准输出。
五、总结
subprocess
模块是Python中用于创建和管理子进程的一个强大工具。它提供了run()
和Popen()
两个主要函数,以及许多其他辅助函数和类。run()
函数是一个高级函数,用于运行命令并等待其完成。而Popen()
函数则更底层,它允许你更精细地控制子进程的行为。communicate()
方法是Popen
对象的一个方法,用于与进程交互。通过组合使用这些函数和方法,你可以轻松地启动新的
处理结果:
一、subprocess
模块概述
subprocess
模块允许你启动新的应用程序,连接到它们的输入输出错误管道,并获取它们的返回码。这个模块提供了一个高级接口来创建和管理子进程,并收集它们的输出。
二、subprocess.run()
方法
subprocess.run()
是一个高级函数,用于运行命令并等待完成,然后返回一个CompletedProcess
实例。
示例代码:
```python
result = subprocess.run(["ls", "-l"], captureoutput=True, text=True)
print("Return code", result.returncode)
- 我们首先导入了
subprocess
模块。三、
subprocess.Popen()
方法subprocess.Popen()
是一个更底层的函数,用于启动子进程,并返回一个Popen
对象,你可以使用这个对象与进程交互。
示例代码:
```python
process = subprocess.Popen(["ping", "-c", "4", "www.google.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print("Return code_", process.returncode) - 我们使用
subprocess.Popen()
方法启动了一个ping
命令,该命令向www.google.com
发送了4个ICMP回显请求。四、
communicate()
方法communicate()
是Popen
对象的一个方法,用于与进程交互。你可以向进程发送输入,并获取其输出。但是,请注意,你只能调用communicate()
方法一次,因为进程的标准输入、标准输出和标准错误输出管道在调用后会被关闭。
示例代码(向进程发送输入):
```python
process = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
inputdata = "Hello, subprocess!\n"
print("Return code", process.returncode) - 我们使用
subprocess.Popen()
方法启动了一个cat
命令,该命令通常用于显示文件的内容。但是在这里,我们没有指定要显示的文件,所以它会等待从标准输入读取数据。五、总结
subprocess
模块是Python中用于创建和管理子进程的一个强大工具。它提供了run()
和Popen()
两个主要函数,以及许多其他辅助函数和类。run()
函数是一个高级函数,用于运行命令并等待其完成。而Popen()
函数则更底层,它允许你更精细地控制子进程的行为。communicate()
方法是Popen
对象的一个方法,用于与进程交互。通过组合使用这些函数和方法,你可以轻松地启动新的