python中实现监督文件监控与检测上传功能

  

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中实现监督文件监控与检测上传功能