列出所有当前打开的文件句柄?

7 投票
3 回答
17572 浏览
提问于 2025-04-16 02:03

可能重复的问题:
检查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__ 之类的,但除非你真的非常非常需要,不然最好不要去做这些事情。

撰写回答