python中实现监督文件监控与检测上传功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>监督介绍强>
监督机构的中文的“看门狗”,有保护的意思。最早引入监管机构是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些保护处理,譬如让系统重启。这种监督属于硬件层面,必须有硬件电路的支持。
引用>
Linux也引入了监管机构在Linux内核下,当监管机构启动后,便设定了一个定时器,如果在超时时间内没有对/dev/监督进行写操作,则会导致系统重启。通过定时器实现的监督机构属于软件层面。嗯,这样的嘛。好像上面这段话没啥用,连成为谈资都不行。我也是直接百度第一篇复制一段当做介绍,习惯使然。(手动狗头)
在python中文件监控主要有两个库,一个是pyinotify (https://github.com/seb-m/pyinotify/wiki),一个是监督机构(http://pythonhosted.org/watchdog/) .pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装。
<强>监督使用强>
在python中可以直接通过pip安装:
pip安装监督机构——https://pypi.tuna.tsinghua.edu.cn/simple监督主要采用观察者模型。主要有三个角色:观察者,event_handler,被监控的文件夹。三者原本是独立的,主要通过observer.schedule函数将三者串起来。
<强>事件类(事件):强>
watchdog.events.FileSystemEvent (event_type, src_path, is_directory=False)<李> event_type为事件类型,为移动,删除,创建或修改的其中之一李> <>李src_path为触发该事件的文件或目录路径李> <>李is_directory为该事件是否由一个目录触发李>
监督能实现在不同平台下都能兼容,并监控相关事件,但是如果在Windows下,是有很多问题的,具体的会在后面提出,那懂了事件类,我们就可以看看事件处理方法:
那现在有了处
。观察家进口观察者 从监管机构。活动导入* 导入的时间 类FileEventHandler (FileSystemEventHandler): def __init__(自我): FileSystemEventHandler.__init__(自我) def> dirs=(" # 39; D: \ \ dingshirenwu& # 39;代码," # 39;D: \ \ tuiliu& # 39;代码) 对于dir dirs: event_handler=FileEventHandler () 观察者。计划(event_handler dir,真的) observer.start ()到此为止,基本上已经知道这个模块到底怎么用了,但当我准备在事件里加一个上传机制的时候,发现Windows下的一些问题.Windows下监督并没有权限去监控文件是否完整。即我有一个大文件,2 g的视频即使是内部百米传输,也需要几十秒的时间,但监管机构只能接收到文件创建的时间就立刻进行了文件上传,而不是同Linux并使用的inotify,似乎没有什么好的办法,我也只是能上传一些比较小的如图片等秒传秒下的文件,下面为我的代码:
进口记录 进口队列 进口线程 导入的时间 进口监管机构。观察人士作为观察员 进口监管机构。事件作为事件 从ftplib进口FTP 记录器=logging.getLogger (__name__) 哨兵=没有 def上传(f remote_path local_path): fp=开放(local_path“rb") buf_size=1024 f.storbinary(“的{}“.format (remote_path),《外交政策》,buf_size) fp.close () 类MyEventHandler (events.FileSystemEventHandler): def on_any_event(自我、事件): 超级(MyEventHandler,自我).on_any_event(事件) queue.put(事件) def __init__(自我、队列): 自我。队列=队列 def过程(队列): 而真正的: 事件=queue.get () logger.info(事件) 打印(event.key) #元组 (& # 39;修改# 39;& # 39;C: \ \ \ \管理\ \用户桌面\ \公司文件\ \测试\ \ GitHub \ \ isadb \ \ .idea& # 39;,真的) 如果(event.key) [0]==癱reated": 上传(ftp、remote_path event.src_path) if __name__==& # 39; __main__ # 39;:=logging.DEBUG logging.basicConfig(水平, 格式=& # 39;[% (asctime) % (threadName)年代]% & # 39;(消息), datefmt=& # 39; % H: % M: % & # 39;) ftp=ftp () ftp.connect (“x.x.x.x" 21)第号一个参数可以是ftp服务器的ip或者域名,第二个参数为ftp服务器的连接端口,默认为21 ftp。登录(用户名、密码)#匿名登录直接使用ftp.login () 队列=queue.Queue () num_workers=4=(线程池。线程(=目标过程中,参数=(队列))我的范围(num_workers)] t在池: t。守护进程=True t.start () event_handler=MyEventHandler(队列) 观察者=observers.Observer () observer.schedule ( event_handler, 路径=" # 39;C: \用户桌面\ \ admin \公司文件\ \ GitHub \ isadb& # 39;测试, 递归=True) observer.start () 试一试: 而真正的: time . sleep (1) 除了KeyboardInterrupt: observer.stop () observer.join ()python中实现监督文件监控与检测上传功能