Исходная ситуация:
Приложение, над которым я сейчас работаю, получит уведомление от другого приложения, когда определенный файл добавил данные и готов к чтению. На данный момент у меня есть что-то вроде этого:
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.
Несмотря на то, что файл не тронут нигде в программе, и я не использую with
в файле, я продолжаю получать ValueError: I/O operation on closed file
, когда пытаюсь readline()
его.
Исходное решение:
При попытке выяснить, когда именно файл закрывается, я изменил код приложения на:
foo = Foo()
while True:
if foo.myFile.closed == True:
print "File is closed!"
Но тогда проблема исчезла! Или если я изменю его на:
foo = Foo()
foo.CheckFile()
тогда начинается начальная CheckFile()
, что происходит прямо сейчас. Но затем, когда я нажимаю кнопку ~ через 5 секунд, исключение снова возникает!
После изменения бесконечного цикла до всего лишь pass
, и обнаружив, что все еще работает, я пришел к выводу, что изначально, после создания экземпляра Foo
, код приложения заканчивался, Foo
выход из области действия, и, таким образом, foo.myFile
выходит за пределы области действия и файл закрывается. Несмотря на это, качание удерживало окно открытым, что вызывало ошибки, когда я пытался работать в нераспечатанном файле.
Почему я все еще запутался:
Нечетная часть, если Foo
вышел из сферы действия, почему тогда качание все еще можно было подключить к foo.CheckFile()
вообще? Когда я нажимаю на JButton, не должна ли ошибка быть в том, что объект или метод больше не существует, а не метод, вызываемый успешно, и сообщение об ошибке при работе с файлом?
Моя следующая идея заключалась в том, что, возможно, когда JButton попытался вызвать foo.CheckFile()
и обнаружил, что Foo
больше не существует, он создал новый Foo
, как-то пропустил его __init__
и перешел прямо к его CheckFile()
. Однако, похоже, это не так. Если я изменю Foo.__init__
, чтобы взять параметр, сохраните его в self.myNum
и распечатайте его в CheckFile()
, значение, которое я передаю, когда я создаю исходный объект, всегда присутствует. Это, по-видимому, предполагает, что Foo
вообще не выходит за рамки, что возвращает меня туда, где я начал!!!
РЕДАКТИРОВАТЬ: Подчеркнул вопрос с соответствующей информацией из комментариев и удалил много комментариев.