使此目录同步脚本检测更改并在后台运行

时间:2016-12-19 06:49:24

标签: python python-3.x

我有这个简单的python脚本,它会将sourcedir文件夹的内容同步到targetdir文件夹。

这是代码;

from dirsync import sync

sourcedir = "C:/sourcedir"
targetdir ="C:/targetdir"
sync(sourcedir, targetdir, "sync")

每当进行更改时手动运行此脚本都很麻烦。我想让这个脚本在后台运行,这样每当sourcedir文件夹发生任何变化时,targetdir文件夹就会自动同步。

我正在使用python v3.5

7 个答案:

答案 0 :(得分:4)

为此点击一个应用 a library

import sys
import time
import logging
from watchdog.observers import Observer


def event_handler(*args, **kwargs):
    print(args, kwargs)


if __name__ == "__main__":
    path = '/tmp/fun'
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

答案 1 :(得分:3)

如果您在Linux上运行脚本,则可以使用inotify。 (GitHub)。

它使用内核功能,在监视目录中发生某些事件时通知事件,如文件修改,访问,创建等。这只有很少的开销,因为它使用epoll系统调用来监视更改

import inotify.adapters

i = inotify.adapters.Inotify()
i.add_watch(b'/tmp')
try:
    for event in i.event_gen():
        if event is not None:
            (header, type_names, watch_path, filename) = event
            if 'IN_MODIFY' in type_names:
                # Do something
                sync(sourcedir, targetdir, "sync")
finally:
    i.remove_watch(b'/tmp')

此外,建议使用multiprocessing执行sync部分,除非脚本在同步过程中不会注意更改。根据您的sync实施情况,这可能会导致流程同步问题,这是一个值得讨论的主题。

我的建议,尝试简单的方法,在同一个过程中运行所有内容并测试它是否符合您的需求。

答案 2 :(得分:2)

我认为这两个链接应该让你开始:

Python WMI example

VBScript Filesystemwatcher example

基本思想是查询WMI并获得文件夹/文件中的更改通知。

答案 3 :(得分:2)

您可以检查源目录的修改时间(例如,使用os.path.getmtime(sourcepath)),并且只有在更改时才会同步。

import os
import time
from dirsync import sync

sourcedir = "C:/sourcedir"
targetdir ="C:/targetdir"

mtime, oldmtime = None, None

while True:
    mtime = os.path.getmtime(sourcedir)
    if mtime != oldmtime:
        sync(sourcedir, targetdir, "sync")
        oldmtime = mtime
    time.sleep(60)

答案 4 :(得分:2)

您可以使用win32 api的FindFirstChangeNotification函数。

http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html

答案 5 :(得分:2)

对于Windows,您有watcher,这是.NET FileSystemWatcher API的Python端口。

对于Linux,inotifyx这是一个简单的Python绑定到Linux inotify文件系统事件监视API。

答案 6 :(得分:1)

您可以使用最近更新的 Python 实用程序 watchdog 来监视文件系统事件。

文档中的代码:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    finally:
        observer.stop()
        observer.join()