【发布时间】:2013-08-15 02:54:30
【问题描述】:
我正在尝试打开一个由另一个进程保持打开的日志文件并删除前几行。
在 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 可以在这里帮助我还是我需要切换我的语言?
【问题讨论】:
-
它是哪个 Python - 2 还是 3?
-
2.6.很抱歉没有早点澄清。
-
请注意
O_NONBLOCK标志与多个进程同时打开同一个文件无关。
标签: python windows logging file-io logrotate