Исходная ситуация:
Приложение, над которым я сейчас работаю, получит уведомление от другого приложения, когда в конкретный файл добавлены данные и он готов к чтению. На данный момент у меня есть что-то вроде этого:
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
вообще не выходит за рамки, что возвращает меня обратно туда, откуда я начал !!!
РЕДАКТИРОВАТЬ: Вопрос с соответствующей информацией из комментариев , и удалил множество упомянутых комментариев.