开发者

List all currently open file handles? [duplicate]

开发者 https://www.devze.com 2023-01-09 18:53 出处:网络
This question already has answers here: Closed 12 years ago. Possible Duplicate: check what files are open in Python
This question already has answers here: Closed 12 years ago.

Possible Duplicate:

check what files are open in Python

Hello,

Is it possible to obtain a list of all currently open file handles, I presume that they are stored somewher开发者_运维百科e in the environment.

I am interested in theis function as I would like to safely handle any files that are open when a fatal error is raised, i.e. close file handles and replace potentially corrupted files with the original files.

I have the handling working but without knowing what file handles are open, I am unable to implement this idea.

As an aside, when a file handle is initialised, can this be inherited by another imported method?

Thank you


lsof, /proc/pid/fd/


The nice way of doing this would be to modify your code to keep track of when it opens a file:

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

Then, use log_open instead of open to open files. You could even do something more hacky, like modifying the File class to log itself. That's covered in the linked question above.

There's probably a disgusting, filthy hack involving the garbage collector or looking in __dict__ or something, but you don't want to do that unless you absolutely really truly seriously must.


If you're using python 2.5+ you can use the with keyword (though 2.5 needs `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

I don't know what kind of catastrophic failure needs to bork the with statement, but I assume it's a really bad one. On WinXP, my quick unscientific test:

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

and then killing the process with Windows Task Manager still wrote the data to file.

0

精彩评论

暂无评论...
验证码 换一张
取 消