我正在使用 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/