Почему мой файл закрывается, если я не делаю с ним какое-то время?

Исходная ситуация:

Приложение, над которым я сейчас работаю, получит уведомление от другого приложения, когда в конкретный файл добавлены данные и он готов к чтению. На данный момент у меня есть что-то вроде этого:

class Foo(object):
    def __init__(self):
        self.myFile = open("data.txt", "r")
        self.myFile.seek(0, 2) #seeks to the end of the file

        self.mainWindow = JFrame("Foo",
                                 defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
                                 size = (640, 480))
        self.btn = JButton("Check the file", actionPerformed=self.CheckFile)
        self.mainWindow.add(self.btn)
        self.mainWindow.visible = True

    def CheckFile(self, event):
        while True:
            line = self.myFile.readline()
            if not line:
                break
            print line

foo = Foo()

В конце концов, CheckFile () будет запускаться при получении определенного сообщения на сокете. В настоящий момент я запускаю его с помощью JButton.

Несмотря на то, что файл не затрагивается в других частях программы, и я не использую с в файле, я продолжаю при получении ValueError: операция ввода-вывода в закрытом файле при попытке readline () it.

Исходное решение:

При попытке выяснить, когда именно файл был закрыт, я изменил код своего приложения на:

foo = Foo()
while True:
    if foo.myFile.closed == True:
        print "File is closed!"

Но затем проблема исчезла! Или, если я изменю его на:

foo = Foo()
foo.CheckFile()

, тогда начальный CheckFile () , происходящий сразу же, будет работать. Но затем, когда я нажимаю кнопку примерно через 5 секунд, исключение возникает снова!

После изменения бесконечного цикла на проход и обнаружения, что все по-прежнему работает, я пришел к выводу, что изначально, после создания Foo ничего не оставалось делать, код приложения заканчивался, foo выходил из области видимости, и, таким образом, foo.myFile выходил из область и файл был закрыт. Несмотря на это, Swing удерживал окно открытым, что затем вызывало ошибки, когда я пытался работать с неоткрытым файлом.

Почему я до сих пор не понимаю:

Странная часть - if foo ] вышел за рамки, почему тогда Swing все еще мог подключиться к foo.CheckFile () ? Когда я нажимаю кнопку JButton, не должна ли ошибка заключаться в том, что объект или метод больше не существует, а не в том, что метод был успешно вызван и выдает ошибку при операции с файлом?

Моя следующая идея заключалась в том, что, возможно, когда JButton попытался вызвать foo.CheckFile () и обнаружил, что foo больше не существует, он создал новый Foo , каким-то образом пропустив его __ init __ и сразу перешел к его CheckFile () . Однако, похоже, это тоже не так. Если я изменю Foo .__ init __ , чтобы принять параметр, сохраните его в self.myNum и распечатайте его в CheckFile () , значение, которое я передаю когда я создаю экземпляр, всегда присутствует исходный объект. Похоже, это наводит на мысль, что foo вообще не выходит за рамки, что возвращает меня обратно туда, откуда я начал !!!

РЕДАКТИРОВАТЬ: Вопрос с соответствующей информацией из комментариев , и удалил множество упомянутых комментариев.

12
задан agf 12 August 2011 в 22:19
поделиться