如何观看文件以修改OS X和Python

时间:2013-05-23 03:47:51

标签: python serial-port arduino game-maker

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

使用它的最佳方法是什么?

我一直在阅读有关此问题的几个主题,包括:

How do I watch a file for changes?

How to get file creation & modification date/times in Python?

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

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

ie:我如何使用这个来编写一个事件循环,当修改日期被更改时会注意到它?

基本上:

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

    谢谢

    PS。抱歉编辑。

4 个答案:

答案 0 :(得分:1)

我在OSX上使用了所有Python接口的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()

答案 1 :(得分:0)

此库可能是您想要的:pyinotify

答案 2 :(得分:0)

到目前为止,最简单的方法是以某个间隔轮询文件,检查其上次修改时间(os.path.getmtime())。我不认为每秒轮询都是过分的,如果它只是一个或少数进程轮询,那么几秒钟就不会发疯。这样做除非你有令人信服的理由不这样做。

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

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

答案 3 :(得分: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