python inotify 监控 In_closted_write 和 in_moved_to 事件
Posted
技术标签:
【中文标题】python inotify 监控 In_closted_write 和 in_moved_to 事件【英文标题】:python inotify to monitor for In_closted_write and in_moved_to events 【发布时间】:2017-12-09 02:27:19 【问题描述】:我正在监视要移动或创建的新文件的目录。 在检测到新文件后,我调用另一个 python 脚本来处理该文件。
#!/usr/bin/python
import os
import signal
import sys
import logging
import inotify.adapters
import subprocess
_DEFAULT_LOG_FORMAT = ''
_LOGGER = logging.getLogger(__name__)
def _configure_logging():
_LOGGER.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
formatter = logging.Formatter(_DEFAULT_LOG_FORMAT)
ch.setFormatter(formatter)
_LOGGER.addHandler(ch)
def exit_gracefully(signum, frame):
signal.signal(signal.SIGINT, original_sigint)
sys.exit(1)
signal.signal(signal.SIGINT, exit_gracefully)
def main():
i = inotify.adapters.Inotify()
i.add_watch(b'/home/sort/tmp')
try:
for event in i.event_gen():
if event is not None:
if 'IN_MOVED_TO' in event[1] or 'IN_CLOSE_WRITE' in event[1]:
(header, type_names, watch_path, filename) = event
_LOGGER.info("%s" #"WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s "
#"WATCH-PATH=[%s]"
"FILENAME=%s" + "/" + "%s",
type_names,#header.wd, header.mask, header.cookie, header.len, type_names,
watch_path.decode('utf-8'), filename.decode('utf-8'))
fnp = str(event[2] + "/" + event[3])
print fnp
proc = subprocess.Popen([orgpath, fnp], stderr=subprocess.STDOUT, bufsize=1)
#proc.communicate()
finally:
i.remove_watch(b'/home/sort/tmp')
if __name__ == '__main__':
_configure_logging()
orgdir = os.path.dirname(os.path.realpath(sys.argv[0]))
orgpath = os.path.join(orgdir, "organize.py")
original_sigint = signal.getsignal(signal.SIGINT)
signal.signal(signal.SIGINT, exit_gracefully)
print("Watching /home/sort/tmp for new files")
main()
最终目标是在我调用 API 以抓取元数据时一次只处理一个文件。在短时间内对 API 进行多次调用可能会导致 API 密钥被禁止或暂时阻止。
现在,当我将多个文件复制到监视目录中时,脚本会同时在每个文件上调用。
【问题讨论】:
【参考方案1】:尝试放置一个for循环来运行python文件..
for files in directory:
...code that runs the python file
如果它仍然运行得太快,您可以设置一个计时器来限制 API 调用
import time
for files in directory:
...code that runs the python file
time.sleep(5)
【讨论】:
for 循环会绕过 orgpath 还是子进程? 可能是 proc/subprocess,但我不太确定.. 也许它的 main() 函数.. 我不是 100% 确定它是如何工作的,我无法复制它,因为我不知道组织是什么。 py 会大声笑.. oraganize.py 尚未完成,但仍处于当前形式。 它处理存档以进入制作 api。将结果写入 json。进行 2 次额外的 api 调用以获取更多信息,这些信息也写入 json。 api 调用的结果最终被写入 sqlite 数据库。然后,该文件将移动到根据从 api 调用获得的结果创建的文件夹。如果无法通过 API 识别文件,则会将其移至另一个文件夹进行手动处理。以上是关于python inotify 监控 In_closted_write 和 in_moved_to 事件的主要内容,如果未能解决你的问题,请参考以下文章