python - 在 Python 中替换 subprocess.PIPE?

标签 python python-2.7 python-3.x

我正在使用 subprocess 模块与 linux 命令的输出进行交互。下面是我的代码。

import subprocess
import sys

file_name = 'myfile.txt'
p = subprocess.Popen("grep \"SYSTEM CONTROLLER\" "+ file_name, stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()
print output.strip()

p = subprocess.Popen("grep \"controller\|worker\" "+ file_name, stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()
lines = output.rstrip().split("\n")
print lines

我的程序在执行第二个子进程时挂起,即

p = subprocess.Popen("grep \"controller\|worker\""+ file_name,stdout=subprocess.PIPE, shell=True)

我知道进程挂起的原因是缓冲区重定向到子进程。PIPE 被填满,这阻止了进程进一步写入。

我想知道是否有任何方法可以避免缓冲区满的情况,以便我的程序继续执行而不会出现任何挂起问题?

最佳答案

实际问题是模式和文件名之间缺少空格,因此 grep 等待标准输入 (stdin) 上的输入。

“缓冲区已满”(.communicate() 不易受影响)或 p.stdout.read()(它没有修复任何问题:它将输出加载到内存中,与 .communicate() 不同,如果使用了多个管道,它就会失败)在这里是一个红色的鲱鱼。

删除 shell=True 并为命令使用列表参数:

#!/usr/bin/env python
from subprocess import Popen, PIPE

p = Popen(["grep", r"controller\|worker", file_name], stdout=PIPE)
output = p.communicate()[0]
if p.returncode == 0:
    print('found')
elif p.returncode == 1:
    print('not found')
else: 
    print('error')

关于python - 在 Python 中替换 subprocess.PIPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649530/

相关文章:

python - 如果错误,执行此操作并返回,否则继续在一行中执行

python - 在具有层次索引的 Pandas 数据框中使用 iloc 时遇到问题

python - ":="语法和赋值表达式 : what and why?

python - 小数在提高到 1 的幂时会失去准确性

python - 如何从sqlalchemy中的当前时间计算过去1天的间隔

python - 稍后重写的导入标识符的未解析引用

python - CartPole 的 Deep Q 分数停留在 9 分

python - 如何 pickle 和去 pickle

python - 在 Django 中,如何遍历父模型(用户)中的特定字段,包括附加子模型(用户配置文件)中的一些特定字段

python - 如何使用 warnings.simplefilter() 忽略 SettingWithCopyWarning?