Я пытаюсь открыть файл журнала, открытый другим процессом, и удалить первые несколько строк. В Unix я бы просто сделал os.open('/tmp/file.log', os.O_NONBLOCK)
, и это приблизило бы меня к моей цели.
Теперь я застрял в Windows, и мне нужно как-то повернуть этот журнал, не закрывая приложение, содержащее файл. Это вообще возможно?
Сначала я подумал об открытии дескриптора файла в том месте, где приложение ожидало журнал, и просто действовать как канал в дескриптор файла в Python, но я не смог найти никакого способа сделать это в Windows.
Я также подумал о том, чтобы просто перемещать файл на регулярной основе и позволять приложению воссоздавать файл, но, поскольку он используется другим процессом, это не приносит большой пользы.
Думал и о O_SHLOCK
, но опять же, это Unix, а не Windows. Поэтому я выбрал mmap файл и надеялся, что это сделает его немного более гибким, но это ни к чему меня не привело.
import mmap
import contextlib
import time
with open(r'test.log', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0)) as m:
while 1:
line = m.readline()
if len(line) > 0:
print line
time.sleep(0.5)
Это приводит к тому, что приложение не может получить доступ к файлу, потому что Python удерживает его (и наоборот).
Пришел к мысли о signal.SIGHUP
, но его тоже нет в Windows, так что вернемся к исходной точке.
Я застрял, и я пробовал все это, может ли Python помочь мне здесь или мне нужно переключить язык?
O_NONBLOCK
не имеет ничего общего с открытием одного и того же файла более чем одним процессом одновременно. - person Piotr Dobrogost   schedule 15.07.2016