文件对象析构函数中的键盘中断关闭失败:sys.excepthook 缺少丢失的 sys.stderr


#!/usr/bin/env python 

import sys, re 


def find_position(line):
    pun = ""
    if re.search(r"[.?!]+", line):
        pun = re.search(r"[.?!]+", line).group()
    pos = line.find(pun)
    pos = pos+len(pun)-1
    return pos


def sentence_splitter(filename):
    f = open(filename, "r")
    for line in f:
        line = line.strip()
        print line + "n"
        while line:
            pos  =  find_position(line)
            line2 = line[ : pos+1].split(" ")
            length = len(line2)
            last_word = line2[length -1]
        try:
                if re.search(r"[A-Z]+.*", last_word) or  line[pos+1] != " " or line[pos+2].islower() :
                print line[:pos+1],
                line = line[pos+1:]
            else:
            print line[ : pos+1]
                line = line[pos+1 :]

            except :
                print " error here!!"      
    f.close()        
    return " bye bye"


if __name__=="__main__":
    print sentence_splitter(sys.argv[1])

在执行它时

python sentence_splitter6.py  README  | more

发生错误

KeyboardInterrupt
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

我还必须按CLR + C

它不是自己封闭

尝试过这方面的东西如何处理引发异常的文件析构函数?

如何静音"sys.excepthook 丢失"错误?

链接也,但不满意,请帮助

首先,你的问题就在这里:

while line:
    pos = find_position(line)
    line2 = line[:pos + 1].split(" ")
    length = len(line2)
    last_word = line2[length - 1]

line没有被修改,所以如果它曾经是真的,它总是真的,while没有办法结束。

然后,KeyboardInterrupt不是来自您的执行,而是来自您按下 C-c ,停止您的程序。

此外,在编写python代码时,您还应该尊重PEP8,也可以使用flakes8和/或pylint进行检查。

这是符合PEP8的版本(仍然有无限循环(:

#!/usr/bin/env python3
import sys, re

def find_position(line):
    pun = ""
    if re.search(r"[.?!]+", line):
        pun = re.search(r"[.?!]+", line).group()
    pos = line.find(pun)
    pos = pos+len(pun)-1
    return pos

def sentence_splitter(filename):
    with open(filename, "r") as infile:
        for line in infile:
            line = line.strip()
            print(line + "n")
            while line:
                pos = find_position(line)
                line2 = line[:pos + 1].split(" ")
                length = len(line2)
                last_word = line2[length - 1]
            if ((re.search(r"[A-Z]+.*", last_word) or
                 line[pos+1] != " " or
                 line[pos+2].islower())):
                print(line[:pos+1], end='')
                line = line[pos+1:]
            else:
                print(line[:pos + 1])
                line = line[pos + 1:]
        return " bye bye"
if __name__ == "__main__":
    print(sentence_splitter(sys.argv[1]))

最后,你应该注释你的代码,以便包括你在内的每个人都能理解你在做什么,比如:

def find_position(line):
    """Finds the position of a pun in the line.
    """

另外find_pun_position可能是一个更好的名字...

最新更新