列出所有当前打开的文件句柄?
可能重复的问题:
检查Python中打开了哪些文件
你好,
我想知道有没有办法获取当前所有打开的文件句柄的列表,我猜这些信息应该存储在某个地方。
我对这个功能很感兴趣,因为我想在出现严重错误时安全地处理任何打开的文件,也就是说,关闭文件句柄,并用原始文件替换可能已损坏的文件。
我已经实现了处理,但由于不知道哪些文件句柄是打开的,我无法实现这个想法。
顺便问一下,当一个文件句柄被初始化时,是否可以被其他导入的方法继承?
谢谢
3 个回答
0
如果你使用的是 Python 2.5 及以上版本,你可以使用 with
这个关键词(不过在 2.5 版本中需要先写 `from future import with_statement`)。
with open('filename.txt', 'r') as f:
#do stuff here
pass
#here f has been closed and disposed properly - even with raised exceptions
我不知道是什么样的严重错误会导致 with
语句出问题,但我想那一定是个很糟糕的情况。在 Windows XP 上,我做了一个简单的测试:
import time
with open('test.txt', 'w') as f:
f.write('testing\n')
while True:
time.sleep(1)
然后用 Windows 任务管理器强制结束这个进程,数据还是成功写入了文件。
6
lsof 是一个用来查看当前系统中打开文件的工具,而 /proc/pid/fd/ 是一个文件夹,里面列出了某个特定进程(用 pid 表示,pid 是进程的编号)打开的所有文件的链接。简单来说,lsof 可以帮你找到哪些文件正在被使用,而 /proc/pid/fd/ 则能让你看到某个进程具体打开了哪些文件。
2
一种比较好的做法是修改你的代码,记录下每次打开文件的时间:
def log_open( *args, **kwargs ):
print( "Opening a file..." )
print( *args, **kwargs )
return open( *args, **kwargs )
然后,使用 log_open
来代替 open
打开文件。你甚至可以做一些比较“黑科技”的事情,比如修改 File
类,让它自己记录日志。这个在上面提到的问题中有讲到。
可能还有一些比较“恶心”的黑客手段,比如涉及到垃圾回收器或者查看 __dict__
之类的,但除非你真的非常非常需要,不然最好不要去做这些事情。