从文件编号中获取文件对象

时间:2012-11-29 09:49:33

标签: python file

假设我有一个已打开文件的列表(实际上是文件编号):

import resource
import fcntl

def get_open_fds():
    fds = []
    soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
    for fd in range(3, soft):
        try:
            flags = fcntl.fcntl(fd, fcntl.F_GETFD)
        except IOError:
            continue
        fds.append(fd)
    return fds

现在我想获取这些文件的名称。我怎么能这样做?

修改

只是为了澄清,对于那些低估这个:fd是一个整数。 NOT 是一个文件描述符。很抱歉让您对该名称感到困惑,但代码不言自明。

EDIT2

我对此感到愤怒,我认为是因为我选择了fd来表示文件编号。我刚检查了documentation

  

此模块中的所有函数都将文件描述符fd作为它们的第一个   论点。这可以是整数文件描述符,例如返回的   sys.stdin.fileno(),或者文件对象,例如sys.stdin本身   提供了一个fileno(),它返回一个真正的文件描述符。

所以fd确实是一个整数。它也可以是文件对象,但在一般情况下,fd没有.name

2 个答案:

答案 0 :(得分:6)

根据this answer

for fd in get_open_fds():
    print fd, os.readlink('/proc/self/fd/%d' % fd)

答案 1 :(得分:2)

我在同一条船上。我最终做的是编写自己的open来跟踪所有打开的文件。然后在最初的Python文件中,首先发生的事情是内置的open被我的替换,然后我可以查询当前打开的文件。这就是它的样子:

class Open(object):
    builtin_open = open
    _cache = {}
    @classmethod
    def __call__(cls, name, *args):
        file = cls.builtin_open(name, *args)
        cls._cache[name] = file
        return file
    @classmethod
    def active(cls, name):
        cls.open_files()
        try:
            return cls._cache[name]
        except KeyError:
            raise ValueError('%s has been closed' % name)
    @classmethod
    def open_files(cls):
        closed = []
        for name, file in cls._cache.items():
            if file.closed:
                closed.append(name)
        for name in closed:
            cls._cache.pop(name)
        return cls._cache.items()

import __builtin__
__builtin__.open = Open()

然后......

daemon.files_preserve = [open.active('/dev/urandom')]