下面是我所看到的一个例子:

❯ cat /tmp/test.py
#!/usr/bin/env python3

import csv

with open("/dev/stdout", "w") as f:
    csvwriter = csv.writer(f)
    csvwriter.writerows((_,) for _ in range(10000))

当重定向到文件或发送到标准输出时,它运行得很好.

❯ /tmp/test.py > /dev/null
❯ echo $?
0

然而,当发送到Head以及其他一些工具时,它会引发异常.

❯ /tmp/test.py | head > /dev/null
Traceback (most recent call last):
  File "/tmp/test.py", line 7, in <module>
    csvwriter.writerows((_,) for _ in range(10000))
BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/test.py", line 5, in <module>
    with open("/dev/stdout", "w") as f:
BrokenPipeError: [Errno 32] Broken pipe

如果我有range(15)个左右,那就没问题.问题是,有没有一些我可以在Python中使用的设置来避免这种行为?

推荐答案

来自SIGPIPE(https://docs.python.org/3/library/signal.html#note-on-sigpipe)的python文档:

将程序的输出通过管道传输到HEAD(1)之类的工具,将导致在其标准输出的接收器提前关闭时向您的进程发送SIGPIPE信号.这会导致异常,如BrokenPipeError:[Errno 32]BREAKED PIPE.要处理这种情况,请按如下方式包装您的入口点以捕获此异常:

将它们的示例改编为您的代码,您可以像这样处理此异常:

import os, sys, csv

try:
    with open("/dev/stdout", "w") as f:
        csvwriter = csv.writer(f)
        csvwriter.writerows((_,) for _ in range(10000))
    sys.stdout.flush()
except BrokenPipeError:
    # Python flushes standard streams on exit; redirect remaining output
    # to devnull to avoid another BrokenPipeError at shutdown
    devnull = os.open(os.devnull, os.O_WRONLY)
    os.dup2(devnull, sys.stdout.fileno())
    sys.exit(1)  # Python exits with error code 1 on EPIPE

Python相关问答推荐

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

Pandas 滚动最接近的价值

Pytest两个具有无限循环和await命令的Deliverc函数

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

在极性中创建条件累积和

当点击tkinter菜单而不是菜单选项时,如何执行命令?

什么是最好的方法来切割一个相框到一个面具的第一个实例?

不能使用Gekko方程'

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

递归函数修饰器

Django Table—如果项目是唯一的,则单行

如何从比较函数生成ngroup?

应用指定的规则构建数组

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

用0填充没有覆盖范围的垃圾箱

如何在Polars中创建条件增量列?

Python:使用asyncio.StreamReader.readline()读取长行