需要有关Python RSYNC脚本的反馈

时间:2011-04-21 07:13:31

标签: python rsync

这个脚本看起来效果很好,但我确信这可以由你们中的一些大师优化!

脚本的目的:

  • “观察”具有特定文件扩展名的新文件的目录
  • 确保文件仍未被复制
  • 将文件rsync到远程服务器
  • rsync删除文件
  • 脚本永远循环
  • 幸存互联网/网络中断
  • 在远程服务器上不留下部分文件

    import os
    import subprocess
    import time
    import logging
    import datetime
    from sys import argv
    
    if len(argv) < 3:
        exit('Please provide two arguments - Source Destination')
    
    
    LOC_DIR = argv[1]
    REM_DIR = argv[2]
    
    POLL_INT = 10
    RUN_INT = 60
    FILE_EXT = '.mov'
    
    
    # logging setup
    logging.basicConfig(filename='%s' % os.path.join(LOC_DIR, '%s script.log' % datetime.datetime.now()),level=logging.DEBUG)
    
    # make an easy print and logging function
    def printLog(string):
        print '%s %s' % (datetime.datetime.now(), string)
        logging.info('%s %s' % (datetime.datetime.now(), string))
    
    
    # get the files with absolute paths
    def getFiles(path):
        return [os.path.join(path, entry) for entry in os.listdir(path)]
    
    
    # check if file is still being copied (file size has changed within the poll interval)
    def checkSize(path):
        same = False
        while same is False:
            printLog("Processing '%s'" % os.path.basename(path))
            printLog('Waiting %s seconds for any filesize change' % POLL_INT)
            size1 = os.path.getsize(path)
            time.sleep(POLL_INT)
            size2 = os.path.getsize(path)
            if size1 == size2:
                same = True
                printLog('File size stayed the same for %s seconds' % POLL_INT)
                return same
            else:
                printLog('File size change detected. Waiting a further %s seconds' % POLL_INT)
    
    
    # check if correct file extension
    def checkExt(path):
        if path.endswith(FILE_EXT):
            return True
    
    
    # rsync subprocess
    def rsyncFile(path):
        printLog("Syncing file '%s'" % os.path.basename(path))
        try:
            command = ['rsync', '-a', '--remove-source-files', path, REM_DIR]
            p = subprocess.Popen(command, stdout=subprocess.PIPE)
            for line in p.stdout:
                printLog("rsync: '%s'" %line)
            p.wait()
            if p.returncode == 0:
                printLog('<<< File synced successfully :) >>>')
            elif p.returncode == 10:
                printLog('****** Please check your internet connection!! ******  Rsync error code: %s' % p.returncode)
            else:
                printLog('There was a problem. Error code: %s' % p.returncode)
        except Exception as e:
            logging.debug(e)
    
    
    # main logic
    def main():
        all_files = getFiles(LOC_DIR)
        files = []
        for f in all_files:
            if checkExt(f):
                files.append(f)
        if len(files) == 1:
            printLog('<<< Found %s matching file >>>' % len(files))
        elif len(files) > 1:
            printLog('<<< Found %s matching files >>>' % len(files))
        for f in files:
            if checkSize(f):
                rsyncFile(f)
        printLog('No files found.  Checking again in %s seconds' % RUN_INT)
        time.sleep(RUN_INT)
        printLog('Checking for files')
        main()
    
    if __name__ == "__main__":
    
    
        main()
    

1 个答案:

答案 0 :(得分:2)

首先,消除无用的陈述

# check if correct file extension
def checkExt(path):
    return path.endswith(FILE_EXT)
然后再多一点pythonic

# rsync subprocess
def rsyncFile(path):
    printLog("Syncing file '%s'" % os.path.basename(path))
    try:
        p = subprocess.Popen(['rsync', '-a', '--remove-source-files', path, REM_DIR], stdout=subprocess.PIPE)
        for line in p.stdout:
            printLog("rsync: '%s'" %line)
        p.wait()
        printlog(
            { 
                0  : '<<< File synced successfully :) >>>',
                10 : '****** Please check your internet connection!! ******  Rsync error code: %s' % p.returncode,
            }.get(p.returncode, '****** Please check your internet connection!! ******  Rsync error code: %s' % p.returncode) # A switch statement in python !
        )
    except:
        logging.exception("An exception occured")

使用“logging.exception”时,您将显示导致问题的异常和回溯。

然后减少主要

def main():
    while True:
        files = [f for f in getFiles(LOC_DIR) if checkExt(f)]
        if len(files) == 1:
            printLog('<<< Found %s matching file >>>' % len(files))
        elif len(files) > 1:
            printLog('<<< Found %s matching files >>>' % len(files))
        for f in files:
            if checkSize(f):
                rsyncFile(f)
        printLog('No files found.  Checking again in %s seconds' % RUN_INT)
        time.sleep(RUN_INT)
        printLog('Checking for files')

“while True:”语句将避免在主代码末尾调用main()时可以轻松达到的递归限制

欢迎评论和评论:)