Python получает путь к файлу из файлового дескриптора int (как возвращено из os.open) - PullRequest
1 голос
/ 03 октября 2019

Я использую fusepy, и мне нужно преобразовать дескриптор файла обратно в файловый объект, чтобы я мог получить исходный путь к файлу

Из примеров fusepy, когда файл создается, дескриптор файлавозвращается - например:

def open(self, path, flags):
    print("open:", path)
    return os.open(path, flags)

возвращаемый результат является целым числом: <class 'int'> со значением 4

в отдельной функции с именем write, мне нужно обратить вспятьдескриптор файла обратно в файл, чтобы я мог получить путь к файлу, поэтому я попробовал это:

f = os.fdopen(fh)

Когда я проверяю тип f, я получаю следующее f is type: <class '_io.TextIOWrapper'>

Это не совсем то, что я ожидал, но быстрый dir(f) показывает, что у него есть свойство name, я подумал, что это то, что я искал, за исключением того, что name это просто число 4 ...

Как получить исходный путь к файлу, на который указывает дескриптор?

1 Ответ

1 голос
/ 03 октября 2019

Поскольку это, кажется, удовлетворяет потребность, я пока опубликую это как ответ. Можно получить доступ к базовым объектам через f.buffer и f.buffer.raw (не упомянутое удивление зависит немного от используемой версии Python, в v2 это выглядело иначе), но это все равно не поможет в доступе к имени файла, используемому для открытия файла,Примечание: это могло бы произойти с таким же успехом в вызывающем процессе, и дескриптор мог бы быть унаследован процессом python.

Не уверен, что есть более хороший и более переносимый способ, но можно запросить ОС ина U * X-подобной системе доступным способом будет ссылка на структуру procfs, а именно на приведенный выше пример:

os.readlink(f"/proc/self/fd/{fh}")

Все еще не является совершенно тривиальным вопросом. Дескриптор все еще может быть открыт и использован, в то время как основной файл (имя; ссылка на файловую систему) уже удален.

...