【问题标题】:Polling file for changes with readline() works on macOS but not Debian 9使用 readline() 轮询文件的更改适用于 macOS 但不适用于 Debian 9
【发布时间】:2020-11-24 15:32:06
【问题描述】:

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

以下代码在 macOS 10.15.7 和 Python 3.8.6 上运行良好,但在 Debian 9 和 Python 3.7.3 上运行良好。在 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')

谢谢!

【问题讨论】:

  • “池化”文件是什么意思?您指的是“投票”吗?
  • 目前您的代码中没有退出循环的机制。 exit_pooling 将持续保持 False。
  • 也许你应该先在 Debian 中升级你的 python。
  • 我的意思是投票,我的错。脚本将连续运行,exit_pooling 作为变量只是用于在循环期间进行更好的控制,以防它稍后因某种原因被终止。我无法在 Debian 9 上更新 Python,因为没有可用的反向端口(它是一个托管服务器,所以宿主不喜欢通过源代码构建)

标签: python python-3.x linux debian eof


【解决方案1】:

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

#!/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'

【讨论】:

  • 谢谢。由于我现在被困在服务器上的 Python 3.7 上,我需要一个不使用海象运算符的版本。我的主要问题是 readline() 行为如何从 macOS 到 Debian 不同。当我在文件中添加新行进行测试时,Debian 上的轮询机制无法识别更改
  • 我刚刚尝试了您编辑的答案。它确实打印了 file.log 的内容。但是当我保持脚本运行时,它每秒打印一个“检查......”,然后打开 file.log 并添加一个新行,脚本只是继续打印“检查”而不是打印出添加的新行.这种预期的行为适用于我的本地机器 (macOS),但不适用于 Debian 9
猜你喜欢
  • 2020-06-26
  • 2019-12-05
  • 1970-01-01
  • 2013-11-18
  • 2020-01-09
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多