我有一个python脚本,可以对我的数据库进行一些更新。
此脚本所需的文件在凌晨3点左右被其他进程保存在目录中。
所以我打算安排一个cron工作每天凌晨3点运行;但我想处理这个案子,如果文件在凌晨3点不准确,可能会延迟一段时间。
所以我基本上需要继续检查从凌晨3点开始每5分钟是否存在某个特定名称的文件。我会尝试大约1个小时,如果它没有成功就放弃。
我如何在Python中实现这类功能?
答案 0 :(得分:3)
尝试这样的事情(如果使用的是Python 3,则需要将print语句更改为函数调用。)
#!/usr/bin/env python
import os
import time
def watch_file( filename, time_limit=3600, check_interval=60 ):
'''Return true if filename exists, if not keep checking once every check_interval seconds for time_limit seconds.
time_limit defaults to 1 hour
check_interval defaults to 1 minute
'''
now = time.time()
last_time = now + time_limit
while time.time() <= last_time:
if os.path.exists( filename ):
return True
else:
# Wait for check interval seconds, then check again.
time.sleep( check_interval )
return False
if __name__ == '__main__':
filename = '/the/file/Im/waiting/for.txt'
time_limit = 3600 # one hour from now.
check_interval = 60 # seconds between checking for the file.
if watch_file( filename, time_limit, check_interval ):
print "File present!"
else:
print "File not found after waiting:", time_limit, " seconds!"
答案 1 :(得分:3)
对于此类任务,您需要使用watchdog
库来监听和监控系统事件。
它可以监控的一个事件是文件系统事件,通过FileSystemEventHandler
类,具有on_created()
方法。
你最终会写一个&#34;包装&#34;脚本,它可以连续运行。该脚本将使用watchdog侦听该特定目录。创建文件的那一刻,将通知此脚本 - 然后您必须检查创建的文件是否与目标文件的模式匹配,然后执行您的自定义代码。
幸运的是,由于这是一项常见任务 - 已经有PatternMatchingEventHandler
可用,它继承自FileSystemEventHandler
,但会监视与模式匹配的文件。
然后您的包装器脚本变为:
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
class FileWatcher(PatternMatchingEventHandler):
patterns = ["*.dat"] # adjust as required
def process(self, event):
# your actual code goes here
# event.src_path will be the full file path
# event.event_type will be 'created', 'moved', etc.
print('{} observed on {}'.format(event.event_type, event.src_path))
def on_created(self, event):
self.process(event)
if __name__ == '__main__':
obs = Observer() # This is what manages running of your code
obs.schedule(FileWatcher(), path='/the/target/dir')
obs.start() # Start watching
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
ob.stop()
obs.join()
答案 2 :(得分:0)
这首先是我想到的,非常直截了当:
from time import sleep
counter = 0
working = True
while counter < 11 and working:
try:
# Open file and do whatever you need
working = False
except IOError:
counter +=1
sleep(5*60)
更好的解决方案
from time import sleep
counter = 0
working = True
while counter < 11 and working:
if os.path.isfile('path/to/your/file')
# Open file and do whatever you need
working = False
else:
counter +=1
sleep(5*60)
答案 3 :(得分:0)
在Python中,您可以检查文件是否存在
import os.path
os.path.isfile(filename)
然后你将你的cron从凌晨3点起每隔5分钟运行一次: * / 5 3 * * * /path-to-your/script.py
您可以写一个简单的文件来控制您是否已经从文件中读取数据(或者如果您已经使用过数据库,则可以使用数据库)
答案 4 :(得分:-1)
你可以使用Twisted,它是反应堆它比无限循环好得多!你也可以使用reactor.callLater(myTime,myFunction),当调用myFunction时你可以调整myTime并使用相同的API callLater()添加另一个回调。