我有这个简单的python脚本,它会将sourcedir
文件夹的内容同步到targetdir
文件夹。
这是代码;
from dirsync import sync
sourcedir = "C:/sourcedir"
targetdir ="C:/targetdir"
sync(sourcedir, targetdir, "sync")
每当进行更改时手动运行此脚本都很麻烦。我想让这个脚本在后台运行,这样每当sourcedir
文件夹发生任何变化时,targetdir
文件夹就会自动同步。
我正在使用python v3.5
答案 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)
答案 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()