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

7

可能是重复问题:
检查Python中打开的文件

你好,

是否可以获取当前所有打开的文件句柄列表?我认为它们存储在环境中的某个位置。

我对此功能感兴趣,因为当发生致命错误时,我想安全地处理任何已打开的文件,即关闭文件句柄并用原始文件替换可能已损坏的文件。

我已经处理了文件,但不知道哪些文件句柄是打开的,因此无法实现这个想法。

顺便说一下,当一个文件句柄被初始化后,它能被另一个导入的方法继承吗?

谢谢


3
请列出Python中打开的文件 - robert
哪个操作系统?可能还有助于将其作为一个标签添加。 - Mawg says reinstate Monica
3个回答

6

lsof, /proc/pid/fd/


我使用了lsof -p <pid_of_python_process>,在这里找到:https://dev59.com/qGcs5IYBdhLWcg3w8oTK - damio

2

优雅的做法是修改您的代码以跟踪它何时打开文件:

def log_open( *args, **kwargs ):
    print( "Opening a file..." )
    print( *args, **kwargs )
    return open( *args, **kwargs )

接下来打开文件时,请使用log_open而不是open。甚至可以做一些更加hacky的事情,比如修改File类以记录自身。这在上面链接的问题中有涉及。

可能存在一种包含垃圾回收器或查看__dict__等内容的令人作呕、肮脏的hack,但除非您绝对真正地必须要这样做,否则您不应该这样做。


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语句,但我认为这是一个非常严重的问题。在WinXP上,我的快速非科学测试:

import time
with open('test.txt', 'w') as f:
   f.write('testing\n')
   while True:
       time.sleep(1)

然后使用Windows任务管理器结束进程,但仍会将数据写入文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接