使用 readline() 轮询文件以进行更改,但不适用于 Debian 9

Polling file for changes with readline() works on macOS but not Debian 9

提问人:Jim B 提问时间:11/24/2020 最后编辑:Jim B 更新时间:11/25/2020 访问量:104

问:

我想“轮询”文件以进行更改。

以下代码在带有 Python 3.8.6 的 macOS 10.15.7 上工作正常,但在带有 Python 3.7.3 的 Debian 9 上不起作用。在 Debian 上,当我向要池化的文件添加新行时,它无法被识别并继续进行打印检查。

from time import sleep
from datetime import datetime
 
wait = 1
    with open('file.log') as fp:
        exit_pooling = False
        while not exit_pooling:
            print("*** check " + str(datetime.now()))
            line = fp.readline()

            if not line:
                sleep(wait)
                continue
            else:
                print('process line')

谢谢!

python-3.x linux debian eof

评论

0赞 tink 11/24/2020
“pooling” a file 是什么意思?你是说“轮询”吗?
0赞 Tobin 11/24/2020
目前,代码中没有退出循环的机制。 将持续保持 False。exit_pooling
0赞 Waket Zheng 11/24/2020
也许你应该先在 Debian 中升级你的 python。
0赞 Jim B 11/24/2020
我的意思是民意调查,我的错。脚本将连续运行,exit_pooling作为变量只是为了在循环期间更好地控制,以防以后由于某种原因终止。我无法在 Debian 9 上更新 Python,因为没有可用的向后移植(它是一个托管服务器,所以托管商更喜欢不按源代码构建)

答:

0赞 Waket Zheng 11/24/2020 #1

在 Ubuntu18.04 和 Python3.6 上按预期工作:

#!/usr/bin/env python3
from time import sleep
from datetime import datetime
from pathlib import Path

wait = 1
with Path('file.log').open() as fp:
    exit_pooling = False
    while not exit_pooling:
        print("*** check " + str(datetime.now()))
        line = fp.readline()
        if not line:
            sleep(wait)
        else:
            print(f'process line: {line}')
            exit_pooling = line.strip() == 'exit'

评论

0赞 Jim B 11/25/2020
谢谢。由于我现在被困在服务器上的 Python 3.7 上,因此我需要一个不使用 walrus 运算符的版本。我的主要问题是为什么 readline() 行为从 macOS 到 Debian 不同。当我向文件添加新行进行测试时,Debian 上的轮询机制无法识别更改
0赞 Jim B 11/25/2020
我刚刚尝试了您编辑的答案。它确实打印了file.log的内容。但是,当我保持脚本运行时,它会打印一个“检查......”每秒,打开file.log并添加一行新行,脚本只是继续打印“检查”,而不是打印出添加的新行。这种预期行为适用于我的本地计算机 (macOS),但不适用于 Debian 9