在Python中进行冲洗时,如何防止BrokenPipeError? - python

问题:有没有办法在不获取 flush=True 的情况下将print()用于BrokenPipeError函数?

我有一个脚本pipe.py:

for i in range(4000):
    print(i)

我从Unix命令行这样称呼它:

python3 pipe.py | head -n3000

它返回:

0
1
2

这个脚本也是如此:

import sys
for i in range(4000):
    print(i)
    sys.stdout.flush()

但是,当我运行此脚本并将其通过管道传递到head -n3000时:

for i in range(4000):
    print(i, flush=True)

然后我得到这个错误:

    print(i, flush=True)
BrokenPipeError: [Errno 32] Broken pipe
Exception BrokenPipeError: BrokenPipeError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored

我也尝试了下面的解决方案,但仍然得到BrokenPipeError:

import sys
for i in range(4000):
    try:
        print(i, flush=True)
    except BrokenPipeError:
        sys.exit()

参考方案

BrokenPipeError是正常的,因为读取过程(头)终止并关闭管道的末端,而写入过程(python)仍尝试写入。

如果是异常情况,并且python脚本接收到BrokenPipeError-更准确地说,Python解释程序会接收到系统SIGPIPE信号,该信号会捕获并引发BrokenPipeError以允许脚本处理错误。

而且您可以有效地处理该错误,因为在上一个示例中,您仅看到一条消息,指出忽略了该异常-好的,它不是真的,但似乎与Python中的此open issue有关:Python开发人员认为警告用户警告很重要。异常情况。

真正发生的是,即使您捕获到异常,Python解释器AFAIK始终会在stderr上发出信号。但是您只需要在退出前关闭stderr即可消除该消息。

我将您的脚本略微更改为:

  • 像上一个示例
  • 一样捕获错误

  • 捕获IOError(在Windows64上为Python34)或BrokenPipeError(在FreeBSD 9.0的Python 33中)-并显示该
  • 的消息

  • 在stderr上显示一条自定义的Done消息(由于管道断开,stdout已关闭)
  • 在退出以关闭消息
  • 之前关闭stderr

    这是我使用的脚本:

    import sys
    
    try:
        for i in range(4000):
                print(i, flush=True)
    except (BrokenPipeError, IOError):
        print ('BrokenPipeError caught', file = sys.stderr)
    
    print ('Done', file=sys.stderr)
    sys.stderr.close()
    

    这是python3.3 pipe.py | head -10的结果:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BrokenPipeError caught
    Done
    

    如果您不想要多余的消息,请使用:

    import sys
    
    try:
        for i in range(4000):
                print(i, flush=True)
    except (BrokenPipeError, IOError):
        pass
    
    sys.stderr.close()
    

    在返回'Response'(Python)中传递多个参数 - python

    我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

    Python exchangelib在子文件夹中读取邮件 - python

    我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

    Python GPU资源利用 - python

    我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

    R'relaimpo'软件包的Python端口 - python

    我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

    Python:图像处理可产生皱纹纸效果 - python

    也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…