我在使用Python 2.5的windows上。我有一个用于写作的公开文件。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除文件时,它出现错误,表示一个进程仍然保存文件的句柄。为什么在调用file.close()后Python不释放文件句柄?
如果我关闭python,并再试一次,它会成功。
我在使用Python 2.5的windows上。我有一个用于写作的公开文件。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除文件时,它出现错误,表示一个进程仍然保存文件的句柄。为什么在调用file.close()后Python不释放文件句柄?
如果我关闭python,并再试一次,它会成功。
它关闭它们。 你确定f.close()被调用吗? 我刚刚测试过相同的场景,Windows为我删除了这个文件。
你是否正在处理文件对象的任何异常?如果是这样,请确保错误处理看起来是这样的:
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(我强烈建议前者)。
教程解释:
with open('/tmp/workfile', 'r') as f:
read_data = f.read()
它的工作原理,当你写或酸洗/在unpickle,太
这是不是真的有必要试图finally块:做事Java的方式,而不是Python
我一直在寻找这个,因为同样的事情发生在我身上。这个问题并没有帮助我,但我想我知道发生了什么。
在我写的脚本的原始版本中,如果发生异常,我忽略在文件的'finally'子句中添加。
我在交互式提示符下测试脚本,并在文件打开时发生异常。我没有意识到的是,文件对象并没有立即被垃圾回收。之后,当我运行脚本时(仍然来自同一个交互式会话),即使关闭了文件对象,第一个文件对象仍然没有被使用,所以文件句柄仍在使用中操作系统的角度。
一旦我关闭了交互式提示符,问题就消失了,我记得在文件打开时发生异常并意识到发生了什么。 (道德:不要试图对睡眠不足进行编程:))
当然,我不知道这是在原始海报的情况下发生了什么,即使原始海报仍然在附近,他们可能不记得具体情况,但症状是相似的,所以我想我会添加这个作为检查的东西,对于陷入相同情况并寻找答案的任何人。
我从来不知道Pythons发布*任何*容易,让可怜的小文件。 :P:P – Cerebrus 2009-02-22 15:37:20
@Cerberus Tee hee! – Pitarou 2009-02-22 15:54:31