newbie python subprocess: quot;write error: Broken pipequot;(新手 python 子进程:“写入错误:管道损坏)
问题描述
感谢以下有用的建议:
所以当我修复它时似乎是固定的
So it seems to be fixed when I
- 将命令分离到对 Popen 的单独调用中
- stderr=subprocess.PIPE 作为每个 Popen 链的参数.
新代码:
import subprocess
import shlex
import logging
def run_shell_commands(cmds):
""" Run commands and return output from last call to subprocess.Popen.
For usage see the test below.
"""
# split the commands
cmds = cmds.split("|")
cmds = list(map(shlex.split,cmds))
logging.info('%s' % (cmds,))
# run the commands
stdout_old = None
stderr_old = None
p = []
for cmd in cmds:
logging.info('%s' % (cmd,))
p.append(subprocess.Popen(cmd,stdin=stdout_old,stdout=subprocess.PIPE,stderr=subprocess.PIPE))
stdout_old = p[-1].stdout
stderr_old = p[-1].stderr
return p[-1]
pattern = '"^85567 "'
file = "j"
cmd1 = 'grep %s %s | sort -g -k3 | head -10 | cut -d" " -f2,3' % (pattern, file)
p = run_shell_commands(cmd1)
out = p.communicate()
print(out)
原帖:
我花了太长时间试图解决一个简单的 subprocess.Popen 管道问题.
I've spent too long trying to solve a problem piping a simple subprocess.Popen.
代码:
import subprocess
cmd = 'cat file | sort -g -k3 | head -20 | cut -f2,3' % (pattern,file)
p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
for line in p.stdout:
print(line.decode().strip())
文件的输出长度约为 1000 行:
Output for file ~1000 lines in length:
...
sort: write failed: standard output: Broken pipe
sort: write error
长度>241 行的文件的输出:
Output for file >241 lines in length:
...
sort: fflush failed: standard output: Broken pipe
sort: write error
<241 行长度的文件的输出很好.
Output for file <241 lines in length is fine.
我一直在疯狂地阅读文档和谷歌搜索,但是我缺少关于子进程模块的一些基本内容......可能与缓冲区有关.我试过 p.stdout.flush() 并使用缓冲区大小和 p.wait().我试图用像'sleep 20;'这样的命令来重现它.catmoderatefile' 但这似乎运行没有错误.
I have been reading the docs and googling like mad but there is something fundamental about the subprocess module that I'm missing ... maybe to do with buffers. I've tried p.stdout.flush() and playing with the buffer size and p.wait(). I've tried to reproduce this with commands like 'sleep 20; cat moderatefile' but this seems to run without error.
推荐答案
来自 子流程 文档:
# To replace shell pipeline like output=`dmesg | grep hda`
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
这篇关于新手 python 子进程:“写入错误:管道损坏"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:新手 python 子进程:“写入错误:管道损坏"
基础教程推荐
- 对多索引数据帧的列进行排序 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
