2009-02-22 201 views
5

我在使用Python 2.5的windows上。我有一个用于写作的公开文件。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除文件时,它出现错误,表示一个进程仍然保存文件的句柄。为什么在调用file.close()后Python不释放文件句柄?

如果我关闭python,并再试一次,它会成功。

+0

我从来不知道Pythons发布*任何*容易,让可怜的小文件。 :P:P – Cerebrus 2009-02-22 15:37:20

+0

@Cerberus Tee hee! – Pitarou 2009-02-22 15:54:31

回答

4

它关闭它们。 你确定f.close()被调用吗? 我刚刚测试过相同的场景,Windows为我删除了这个文件。

2

你是否正在处理文件对象的任何异常?如果是这样,请确保错误处理看起来是这样的:

f = open("hello.txt") 
try: 
    for line in f: 
     print line 
finally: 
    f.close() 

在考虑为什么要做到这一点,考虑下面的代码行:

f = open('hello.txt') 
try: 
    perform_an_operation_that_causes_f_to_raise_an_exception() 
    f.close() 
except IOError: 
    pass 

正如你所看到的,f.close将永远不会在上面的代码中调用。问题是,上面的代码也会导致f不会收集垃圾。原因是在sys.traceback中仍然会引用f,在这种情况下,唯一的解决方案是在finally块中手动调用f上的close或将sys.traceback设置为None(我强烈建议前者)。

3

教程解释:

with open('/tmp/workfile', 'r') as f: 
    read_data = f.read() 

它的工作原理,当你写或酸洗/在unpickle,太

这是不是真的有必要试图finally块:做事Java的方式,而不是Python

0

我一直在寻找这个,因为同样的事情发生在我身上。这个问题并没有帮助我,但我想我知道发生了什么。

在我写的脚本的原始版本中,如果发生异常,我忽略在文件的'finally'子句中添加。

我在交互式提示符下测试脚本,并在文件打开时发生异常。我没有意识到的是,文件对象并没有立即被垃圾回收。之后,当我运行脚本时(仍然来自同一个交互式会话),即使关闭了文件对象,第一个文件对象仍然没有被使用,所以文件句柄仍在使用中操作系统的角度。

一旦我关闭了交互式提示符,问题就消失了,我记得在文件打开时发生异常并意识到发生了什么。 (道德:不要试图对睡眠不足进行编程:))

当然,我不知道这是在原始海报的情况下发生了什么,即使原始海报仍然在附近,他们可能不记得具体情况,但症状是相似的,所以我想我会添加这个作为检查的东西,对于陷入相同情况并寻找答案的任何人。

相关问题