通过实例解析python subprocess模块原理及用法
1. subprocess模块简介
subprocess模块是Python标准库中的一个模块,主要用于创建新进程和与其进行交互(传递数据或获取输出结果)。
subprocess提供了多种创建、运行子进程以及与其进行通讯的方法,包括:
- Popen
: 在终端启动一个新的子进程,并链接它的标准输入/输出/错误。
- call
: 启动一个新的子进程并等待其执行完毕,可以返回该进程的返回值。
- check_call
、check_output
等方法等。
2. Popen方法使用示例
2.1 运行shell命令并取得输出结果
import subprocess
# 命令执行后的输出流,会输出流的内容作为函数的返回值
output = subprocess.Popen(["ls", "/"], stdout=subprocess.PIPE).communicate()[0]
# 将二进制数据转换成字符串,并打印出来
print(output.decode('utf-8'))
上面的代码执行了 ls /
命令并将其输出结果存储在output中,并通过 communicate()
方法获取其控制台输出。其中 stdout=subprocess.PIPE
部分表示将子进程输出到主进程,然后用 communicate 获取输出流的数据。decode()
方法将二进制输出内容(b"dirname\nfilname\n"
)转换成可读字符串。
2.2 传递输入并获取结果
import subprocess
# 启动进程并传递参数
process = subprocess.Popen(["cat", "-"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# 向进程写入数据并获取输出结果
output, error = process.communicate("Hello World!".encode('utf-8'))
# 输出结果
print(output.decode('utf-8'))
上面的代码演示了如何向进程输入数据,并取得输入后的结果。encode()
方法将字符串转换成二进制数据。这里以 cat 命令作为示例,将传递的数据打印到控制台。
3. 子进程和主进程的交互
可以通过 communicate()
方法和进程进行交互,communicate()
方法会将子进程的输入、输出、错误管道都关闭,通过子进程的标准输出和错误输出,返回一个以 UTF-8 编码的 (stdout, stderr)元组。
3.1 获取返回值
import subprocess
# 执行命令,将执行结果以异常形式抛出
try:
# run shell command
return_code = subprocess.check_call(['ls', '-l'])
print('子进程返回值:', return_code)
except subprocess.CalledProcessError as e:
print('执行错误:', e.output)
print('返回码:', e.returncode)
上述代码示例中,我们使用了 check_call
方法,并通过 return_code
取得了子进程的返回值。如果命令执行失败或者返回值不为0,则会抛出 CalledProcessError
异常。
3.2 直接捕获输出流
import subprocess
# 执行第一个子进程,并将输出通过管道传递给第二个子进程
p1 = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "substring"], stdin=p1.stdout, stdout=subprocess.PIPE)
# 输出第二个进程的结果
print(p2.communicate()[0].decode('utf-8'))
上述代码示例是使用Popen启动两个子进程,第一个子进程获取当前目录的内容,第二个子进程在第一个子进程的输出流中查找一个包含特定字符串(substring)的文件名,并将匹配成功的内容输出到标准输出流。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通过实例解析python subprocess模块原理及用法 - Python技术站