当前位置: 首页 > 面试题库 >

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

黄查猛
2023-03-14
问题内容

问题:有没有办法使用flush=Trueprint()函数的方法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)仍会尝试进行写操作。

Is
一种异常情况,并且python脚本收到一个BrokenPipeError-更准确地说,Python解释器收到一个系统SIGPIPE信号,该信号捕获并引发该信号BrokenPipeError以允许脚本处理错误。

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

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

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

  • 像上一个示例一样捕获错误
  • 捕获IOError(在Windows64上为Python34)或BrokenPipeError(在FreeBSD 9.0上为Python 33)-并显示一条消息
  • 在stderr上显示自定义的 “完成” 消息(由于管道断开,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()


 类似资料:
  • 问题内容: 我目前正在使用以下查询来使用php获取mysql中的值: 该代码正在运行,但是现在我担心sql注入。 如何防止SQL注入? 这样安全吗? 问题答案: 来自WordPress Codex,关于保护查询免受SQL注入攻击 : 如果进一步向下滚动,则有一些示例。 您还应该阅读数据库验证文档 ,以更全面地了解WordPress中的SQL转义。

  • 问题内容: 如果将用户输入未经修改地插入到SQL查询中,则应用程序容易受到SQL注入的攻击,如以下示例所示: 这是因为用户可以输入类似的内容value’); DROP TABLE table;–,并且查询变为: 可以采取什么措施来防止这种情况的发生? 问题答案: Use prepared statements and parameterized queries. These are SQL sta

  • 问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 如果将用户输入未经修改地插入到SQL查询中,则应用程序容易受到SQL注入的攻击,如以下示例所示: 这是因为用户可以输入类似的内容,并且查询变为: 如何防止这种情况的发生? 问题答案: 使用准备好的语句和参数化查询。 这些是独立于任何参数发送到数据库服务器并由数据库服务器解析的SQL语句。这样,攻击者就

  • 问题内容: 我正在寻找一些防止SQL注入的技巧。在一个论坛上告诉我我的代码不安全,我正在寻找一个足够好的人来帮助我解决此问题。 我有一个Web表单,提交后转到aspx.cs页,然后将数据插入ms sql数据库。 问题答案: 最直接的解决方法是 不 通过将字符串串联在一起来构建sql,而是使用params。如果您使用的是SqlCommand,则可以执行以下操作,否则按照@MarcB的建议进行操作

  • 问题内容: 如何在Swift中随机或随机排列数组中的元素?例如,如果我的阵列由52张扑克牌,我想 洗牌 的阵列,以洗牌。 问题答案: 该答案详细说明了如何在Swift 4.2+中使用快速统一的算法(Fisher- Yates)进行改组,以及如何在各个早期版本的Swift中添加相同功能。每个Swift版本的命名和行为都与该版本的变异和非变异排序方法匹配。 并且是从Swift 4.2开始原生的 用法示

  • 问题内容: 是否有可能以与PHP具有防止它们攻击的Prepared语句相同的方式来防止在Node.js(最好是使用模块)中进行SQL注入。 如果是这样,怎么办?如果没有, 那么有哪些示例 可以绕过我提供的代码(请参见下文)。 一些上下文: 我正在使用node-mysql模块制作一个包含Node.js+MySql的后端堆栈的Web应用程序。从可用性的角度来看,该模块很棒,但是它还没有实现类似于PHP