文件对象的绝对路径

ast*_*rog 14 python filesystems file

这已经在StackOverflow上讨论了 - 我试图找到一个很好的方法来找到文件对象的绝对路径,但我需要它是健壮的os.chdir(),所以不能使用

f = file('test')
os.path.abspath(f.name)
Run Code Online (Sandbox Code Playgroud)

相反,我想知道以下是否是一个很好的解决方案 - 基本上扩展文件类,以便在打开时,保存文件的绝对路径:

class File(file):

    def __init__(self, filename, *args, **kwargs):
        self.abspath = os.path.abspath(filename)
        file.__init__(self, filename, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

然后就可以做到

f = File('test','rb')
os.chdir('some_directory')
f.abspath # absolute path can be accessed like this
Run Code Online (Sandbox Code Playgroud)

这样做有风险吗?

big*_*ose 14

一个重要的风险是,一旦文件打开,进程就会通过文件描述符处理该文件,而不是文件描述符.在许多操作系统上,文件的路径可以通过其他进程(例如,通过mv不相关进程中的操作)进行更改,文件描述符仍然有效并引用同一文件.

我经常利用这个,例如,开始下载一个大文件,然后意识到目标文件不是我想要的地方,并跳到一个单独的shell并将其移动到正确的位置 - 而下载继续不间断.

因此,当操作系统没有给出这样的保证时,依赖于过程生命周期中保持相同的路径是一个坏主意.