【问题标题】:Preventing write interrupts in python script防止python脚本中的写中断
【发布时间】:2014-09-16 01:11:06
【问题描述】:

我正在用 Python 编写一个解析器,它将一堆数据库行输出到标准输出。为了让数据库正确处理它们,每一行都需要完全打印到控制台。我试图防止中断使打印命令在打印一行中途停止。

我尝试了建议使用信号处理程序覆盖的the solution,但这仍然不能阻止程序中断时部分打印该行。 (我认为 WRITE 系统调用被取消以处理中断)。

以为问题已经被issue 10956 解决了,但是我升级到 Python 2.7.5 后问题仍然存在。

你可以通过运行这个例子来亲眼看看:

# Writer
import signal
interrupted = False
def signal_handler(signal, frame):
    global interrupted
    iterrupted = True

signal.signal(signal.SIGINT, signal_handler)
while True:
    if interrupted:
        break
    print '0123456789'

在终端中:

$ mkfifo --mode=0666 pipe
$ python writer.py > pipe

在另一个终端:

$ cat pipe

然后 Ctrl+C 第一个终端。有时第二个终端会以不完整的字符序列结束。

有什么方法可以确保写满行吗?

【问题讨论】:

    标签: python pipe interrupt system-calls


    【解决方案1】:

    这似乎不像是一个中断问题本身,而是一个缓冲问题。如果我对你的代码做一点小改动,我就看不到部分行了。

    # Writer
    import sys
    
    while True:
        print '0123456789'
        sys.stdout.flush()
    

    【讨论】:

    • 部分写入问题似乎主要是缓冲问题。然而,作者也是正确的,写可以​​被打断。在 C puts/fputs 中有一个特殊的 EINTR 返回码来通知用户由于被中断而导致写入失败。这可能会导致写入被拒绝或部分写入,具体取决于您的系统。
    【解决方案2】:

    听起来您并不是真的想捕捉信号,而是暂时阻止它。这得到了some *nix 风格的支持。但是 Python explicitly 不支持这个。

    您可以为 sigmasks 编写 C 包装器或查找库。但是,如果您正在寻找便携式解决方案...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2015-01-25
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多