Получить позицию для дескриптора файла в Python

Скажем, у меня есть необработанный числовой дескриптор файла, и мне нужно получить текущую позицию в файле на его основе.

import os, psutil

# some code that works with file
lp = lib.open('/path/to/file')

p = psutil.Process(os.getpid())
fd = p.get_open_files()[0].fd  # int

while True:
    buf = lp.read()
    if buf is None:
        break
    device.write(buf)
    print tell(fd)  # how to find where we are now in the file?

В следующем коде lib — это скомпилированная библиотека, которая не дает доступа к файловому объекту. В цикле я использую встроенный метод read, который возвращает обработанные данные. Данные и их длина не связаны с позицией в файле, поэтому я не могу вычислить смещение математически.

Я пытался использовать fdopen, как fd = fdopen(p.get_open_files()[0].fd), но print fd.tell() возвращал только первую позицию в файле, которая не обновлялась в цикле.

Есть ли способ получить текущую позицию в реальном времени в файле на основе файлового дескриптора?


person VisioN    schedule 03.09.2014    source источник
comment
Я думаю, вы немного запутались в своих комментариях ;) (должно быть #)   -  person wnnmaw    schedule 03.09.2014
comment
@wnnmaw Да, проклятый C :D   -  person VisioN    schedule 03.09.2014
comment
Может быть, файл, который вы читаете, не первый, открытый этим процессом, и он типа p.get_open_files()[1] и т.д.   -  person bereal    schedule 03.09.2014
comment
@bereal Нет, это единственный открытый файл в сценарии. В любом случае решение найдено. Спасибо!   -  person VisioN    schedule 03.09.2014


Ответы (1)


Итак, ответ кажется довольно простым. Мне пришлось использовать os.lseek с флагом SEEK_CUR:

import os
print(os.lseek(fd, 0, os.SEEK_CUR))

Я не знаю, единственный ли это подход, но, по крайней мере, он работает нормально.

ИНТЕРПРЕТИРОВАНО: ftell в дескрипторе файла?

person VisioN    schedule 03.09.2014