可能是重复问题:
检查Python中打开的文件
你好,
是否可以获取当前所有打开的文件句柄列表?我认为它们存储在环境中的某个位置。
我对此功能感兴趣,因为当发生致命错误时,我想安全地处理任何已打开的文件,即关闭文件句柄并用原始文件替换可能已损坏的文件。
我已经处理了文件,但不知道哪些文件句柄是打开的,因此无法实现这个想法。
顺便说一下,当一个文件句柄被初始化后,它能被另一个导入的方法继承吗?
谢谢
可能是重复问题:
检查Python中打开的文件
你好,
是否可以获取当前所有打开的文件句柄列表?我认为它们存储在环境中的某个位置。
我对此功能感兴趣,因为当发生致命错误时,我想安全地处理任何已打开的文件,即关闭文件句柄并用原始文件替换可能已损坏的文件。
我已经处理了文件,但不知道哪些文件句柄是打开的,因此无法实现这个想法。
顺便说一下,当一个文件句柄被初始化后,它能被另一个导入的方法继承吗?
谢谢
lsof, /proc/pid/fd/
lsof -p <pid_of_python_process>
,在这里找到:https://dev59.com/qGcs5IYBdhLWcg3w8oTK - damio优雅的做法是修改您的代码以跟踪它何时打开文件:
def log_open( *args, **kwargs ):
print( "Opening a file..." )
print( *args, **kwargs )
return open( *args, **kwargs )
接下来打开文件时,请使用log_open
而不是open
。甚至可以做一些更加hacky的事情,比如修改File
类以记录自身。这在上面链接的问题中有涉及。
可能存在一种包含垃圾回收器或查看__dict__
等内容的令人作呕、肮脏的hack,但除非您绝对真正地必须要这样做,否则您不应该这样做。
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任务管理器结束进程,但仍会将数据写入文件。