如果我暂时没有对它做任何事情,为什么我的文件会被关闭?

Cam*_*son 12 python swing jvm jython file

原始情况:

我正在处理的应用程序将在特定文件已添加数据并准备好读取时接收来自另一个应用程序的通知.目前我有这样的事情:

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()
Run Code Online (Sandbox Code Playgroud)

最终,当在套接字上收到某个消息时,将触发CheckFile().目前,我正在从JButton触发它.

尽管程序中的任何其他位置都没有触及该文件,并且我没有with在文件上使用该文件,但是ValueError: I/O operation on closed file当我尝试readline()它时,我仍然继续使用该文件.

初步解决方案

在试图弄清楚文件何时被关闭时,我将我的应用程序代码更改为:

foo = Foo()
while True:
    if foo.myFile.closed == True:
        print "File is closed!"
Run Code Online (Sandbox Code Playgroud)

但后来问题就消失了!或者,如果我将其更改为:

foo = Foo()
foo.CheckFile()
Run Code Online (Sandbox Code Playgroud)

然后,最初的CheckFile(),直接发生,工作.但是当我在5秒钟后点击按钮时,再次引发异常!

在将无限循环更改为just之后pass,发现一切仍在工作之后,我的结论是,最初,在实例化a之后没有任何事情要做Foo,应用程序代码结束,foo超出范围,因此foo.myFile超出了范围并且文件正在关闭.尽管如此,swing仍然保持窗口打开,当我尝试操作未打开的文件时,这会导致错误.

为什么我仍然困惑:

奇怪的是,如果foo已经超出了范围,那么为什么摇摆仍然能够完全陷入困境foo.CheckFile()?当我点击JButton时,错误不应该是对象或方法不再存在,而不是成功调用方法并在文件操作上给出错误?

我的下一个想法是,也许,当JButton试图调用foo.CheckFile()并发现foo不再存在时,它创建了一个新的Foo,以某种方式跳过它__init__并直接进入它CheckFile().但是,情况似乎也不是这样.如果我修改Foo.__init__为接受一个参数,将其存储在self.myNum中并将其打印出来CheckFile(),当我实例化初始对象时,我传入的值始终存在.这似乎表明foo根本没有超出范围,这使我回到我开始的地方!

编辑:用评论中的相关信息整理提问,并删除了很多评论.

Cam*_*son 4

* 初步、部分答案(添加到问题中)*

我想我刚刚明白了这一点。之后foo = Foo(),由于没有留下任何代码来保持模块忙碌,该对象似乎不再存在,尽管应用程序仍在运行,并且 Swing 窗口正在执行操作。

如果我这样做:

foo = Foo()
while True:
    pass
Run Code Online (Sandbox Code Playgroud)

然后一切都会按我的预期进行。

不过,我仍然很困惑,到底是如何调用 foo.CheckFile() 的。如果问题是 foo.myFile 超出范围并被关闭,那么 JButton 为何能够调用 foo.CheckFile() 呢?

也许其他人可以提供更好的答案。