subprocess popen方法如何配合communicate或select模块使用
时间: 2023-12-10 10:36:50 浏览: 35
`subprocess.Popen()` 方法可以用于启动一个子进程,并返回一个 Popen 对象,该对象包含了该子进程的信息。
要使用 `communicate()` 方法来与子进程进行交互,可以在启动子进程时指定 `stdout` 和 `stderr` 参数为 `subprocess.PIPE`。然后在调用 `communicate()` 方法时,可以将输入数据作为参数传递给它,并且它会返回子进程的输出和错误信息。
以下是一个示例代码:
```python
import subprocess
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print(out.decode())
```
在上面的示例中,`Popen()` 方法启动了一个 `ls -l` 命令,并将其输出重定向到 `stdout` 和 `stderr` 参数所指定的管道。然后,`communicate()` 方法被调用,将子进程的输出和错误信息保存在 `out` 和 `err` 变量中,并打印出了输出。
如果要使用 `select()` 模块来检查子进程是否有数据输出,可以使用 `poll()` 方法来实现。以下是一个示例代码:
```python
import subprocess
import select
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
# 使用 poll() 方法检查子进程是否有数据输出
if p.poll() is not None:
break
# 使用 select() 方法检查子进程的输出管道是否有数据可读
rlist, wlist, xlist = select.select([p.stdout], [], [], 0.1)
# 如果有数据可读,就读取并打印输出
if rlist:
data = rlist[0].read()
print(data.decode())
```
在上面的示例中,使用 `poll()` 方法检查子进程是否已经结束,如果已经结束则退出循环。然后使用 `select()` 方法检查子进程的输出管道是否有数据可读,如果有则读取并打印输出。注意,`select()` 方法的第四个参数表示等待的时间,这里设置为 0.1 秒,表示每 0.1 秒检查一次是否有数据可读。