我正在开发一个带有物理接口的小游戏,每次修改目录中的特定文件时,都需要我用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:我如何使用这个来编写一个事件循环,当修改日期被更改时会注意到它?
基本上:
...重复
谢谢
PS。抱歉编辑。
答案 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