1

我正在开发一个带有物理接口的小游戏,每次修改目录中的特定文件时,我都需要用 python 将一个字符写入串行端口。在玩游戏时,可能会每隔 20 到 30 秒左右修改一次有问题的文件。

最好的方法是什么?

我一直在阅读一些关于此的主题,包括:

如何查看文件的更改?

如何在 Python 中获取文件创建和修改日期/时间?

...但我不确定要使用哪种方法。建议?

编辑:好的,我想为此使用基本的轮询方法。它不必扩展,那么小,无需升级或安装东西=很好。如果有人有一些关于如何使用的链接或资源os.path.getmtime(),那将很有帮助

即:我如何使用它来编写一个事件循环,它会在修改日期发生更改时发出通知?

基本上:

  1. 查看文件的时间戳
  2. 将该时间戳存储在名为 [last_mod] 的变量中
  3. 5 秒后再次查看那个时间戳
  4. 如果当前时间戳与保存的时间戳不同,则执行一个函数,然后将 [last_mod] 的值替换为 current_time stamp

重复...

谢谢你

PS。抱歉编辑。

4

4 回答 4

1

我已经将所有 Python 接口用于 OSX 上的 notify/fsevents,此时我认为 python-watchdog 是最好的。Pythonic 设计,简单易用。不要与奇怪的文件系统掩码搏斗。如果您也有一个 bash 脚本,如果您感到懒惰,它会附带一个有用的 CLI 应用程序。

https://pypi.python.org/pypi/watchdog

这是我不久前整理的一个示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import sys
import time

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

logging.basicConfig(level=logging.DEBUG)

class MyEventHandler(FileSystemEventHandler):
    def catch_all_handler(self, event):
        logging.debug(event)

    def on_moved(self, event):
        self.catch_all_handler(event)

    def on_created(self, event):
        self.catch_all_handler(event)

    def on_deleted(self, event):
        self.catch_all_handler(event)

    def on_modified(self, event):
        self.catch_all_handler(event)

path = '/tmp/'

event_handler = MyEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()
于 2013-05-23T05:37:49.137 回答
0

到目前为止,最简单的做法是每隔一段时间轮询一个文件,检查它的最后修改时间(os.path.getmtime())。我觉得每秒轮询一点都不为过,如果只是一个或少数几个进程轮询,一秒钟几次也不算疯狂。除非您有令人信服的理由不这样做,否则请这样做。

在 OS X 中,可以通过FSEvents 协议(至少对于 HFS+ 文件系统)与文件系统事件进行交互。当特定文件或目录发生更改时,应该可以注册通知事件,如果您需要进行更大规模的监控,这将是最好的方法。我没有在 python 中执行此操作的经验,但是一个声称对此有所帮助的项目是MacFSEvents。毫无疑问,有一些更直接的方法可以使用带有 PyObjC 的 Cocoa API 来做到这一点。

确实,除非您需要大规模观察文件系统事件,否则我不会为复杂的解决方案而烦恼。如果您正在观看每 20-30 秒左右更改一次的单个文件,只需轮询事件循环中的更改,并使用计时器确保您不会太频繁地轮询。

于 2013-05-23T04:27:57.330 回答
0

一个简单的轮询循环看起来像这样:

import time
import os

mtime_last = 0
while True:
    time.sleep(5)
    mtime_cur = os.path.getmtime("/path/to/your/file")
    if mtime_cur != mtime_last:
        do_stuff()
    mtime_last = mtime_cur
于 2013-05-31T21:52:33.510 回答
0

这个库可能是你想要的:pyinotify

于 2013-05-23T03:55:56.110 回答