pexpect有用的提示-使用child.readline()查找EOF并拥有自己的计算机备份代码

时间:2018-12-30 20:31:50

标签: pexpect

我已经使用该网站一百多次,它对我的​​编码(在python,arduino,终端命令和Window的提示符下)有很大帮助。我以为我会积累一些发现的知识,因为Stack溢出无法帮助我,但对类似情况下的其他人会有所帮助。因此,请看下面的代码。我希望能帮助人们创建自己的备份代码。我为下面的代码中的“ while'\ r \ n'输出”部分感到最为自豪。 :

    output = child0.readline()
    while '\r\n' in output:
        msg.log(output.replace('\r\n', ''), logMode + 's')
        output = child0.readline()

当程序完成运行时,这有助于找到EOF。因此,您可以在程序运行时输出终端程序的输出。

我还将在此代码中添加Windows版本。可能是robocopy。

有关以下代码的任何问题,请随时提出。注意:我更改了人的名字,并删除了我的用户名和密码。

#!/usr/bin/python

# Written by irishcream24, amateur coder


import subprocess
import sys
import os.path
import logAndError # my own library to handle errors and log events
from inspect import currentframe as CF # help with logging
from inspect import getframeinfo as GFI # help with logging
import threading
import fcntl
import pexpect
import time
import socket
import time as t



from sys import platform
if platform == "win32":
    import msvcrt
    portSearch = "Uno"
    portResultPosition = 1
elif platform == "darwin":
    portSearch = "usb"
    portResultPosition = 0
else:
    print 'Unknown operating system'    
    print 'Ending Program...'
    sys.exit()



# Check if another instance of the program is running, if so, then stop second.
pid_file = 'program.pid'
fp = open(pid_file, 'w')
try:
    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    # another instance is running
    print "Program already running, stopping the second instance..."
    sys.exit(1)



# Determine where main program files are stored
directory = os.path.dirname(os.path.realpath(__file__))



# To print stderr to both screen and file
errCounter = 0
exitFlag = [0]
class tee:
def __init__(self, _fd1, _fd2):
    self.fd1 = _fd1
    self.fd2 = _fd2

def __del__(self):
    if self.fd1 != sys.stdout and self.fd1 != sys.stderr :
        self.fd1.close()
    if self.fd2 != sys.stdout and self.fd2 != sys.stderr :
        self.fd2.close()

def write(self, text):
    global errCounter
    global exitFlag
    if errCounter == 0:
        self.fd1.write('%s: ' %t.strftime("%d/%m/%y %H:%M"))
        self.fd2.write('%s: ' %t.strftime("%d/%m/%y %H:%M"))
        errCounter = 1
        exitFlag[0] = 1
    self.fd1.write(text)
    self.fd2.write(text)

def flush(self):
    self.fd1.flush()
    self.fd2.flush()


# Error and log handling
errMode = 'pf' # p = print to screen, f = print to file,  e = end program
errorFileAddress = '%s/errorFile.txt' %directory
outputlog = open(errorFileAddress, "a")
sys.stderr = tee(sys.stderr, outputlog)
logFileAddress = '%s/log.txt' %directory
logMode = 'pf' # p = print to screen, f = print to file
msg = logAndError.logAndError(errorFileAddress, logFileAddress)


# Set computer to be backed up
sourceComputer = 'DebbieMac'
try:
    sourceComputer = sys.argv[1]
except:
    print 'No source arguement given.'

if sourceComputer == 'SamMac' or sourceComputer == 'DebbieMac' or sourceComputer == 'mediaCentre' or sourceComputer == 'garageComputer':
pass
else:
    msg.error('incorrect source computer supplied!', errMode,     GFI(CF()).lineno, exitFlag)
    sys.exit()


# Source and destination setup
backupRoute = 'network'
try:
    backupRoute = sys.argv[2]
except:
    print 'No back up route arguement given.'

if backupRoute == 'network' or backupRoute == 'direct' or backupRoute == 'testNetwork' or  backupRoute == 'testDirect':
    pass
else:
    msg.error('incorrect backup route supplied!', errMode,     GFI(CF()).lineno, exitFlag)
    sys.exit()


# Source, destination and exclude dictionaries
v = {
'SamMac network source' : '/Users/SamJones',
'SamMac network destination' : '/Volumes/Seagate/Sam_macbook_backup/Backups',
'SamMac direct source' : '/Users/SamJones',
'SamMac direct destination' : '/Volumes/Seagate\ Backup\ Plus\ Drive/Sam_macbook_backup/Backups',
'SamMac testNetwork source' : '/Users/SamJones/Documents/Arduino/arduino_sketches-master',
'SamMac testNetwork destination' : '/Volumes/Seagate/Sam_macbook_backup/Arduino',
'SamMac exclude' : ['.*', '.Trash', 'Library', 'Pictures'],
'DebbieMac network source' : '/Users/DebbieJones',
'DebbieMac network destination' : '/Volumes/Seagate/Debbie_macbook_backup/Backups',
'DebbieMac direct source' : '/Users/DebbieJones',
'DebbieMac direct destination' : '/Volumes/Seagate\ Backup\ Plus\ Drive/Debbie_macbook_backup/Backups',
'DebbieMac testNetwork source': '/Users/DebbieJones/testFolder',
'DebbieMac testNetwork destination' : '/Volumes/Seagate/Debbie_macbook_backup',
'DebbieMac testDirect source' : '/Users/DebbieJones/testFolder',
'DebbieMac testDirect destination' : '/Volumes/Seagate\ Backup\ Plus\ Drive/Debbie_macbook_backup',
'DebbieMac exclude' : ['.*', '.Trash', 'Library', 'Pictures']
}



# Main threading code
class mainThreadClass(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        PIDMessage = 'Starting backup PID: %s'%os.getpid()
        msg.log(PIDMessage, logMode)
        mainThread()
        msg.log('Process completed successfully\n', logMode)



def mainThread():

    if platform == "win32":
        pass

    elif platform == "darwin":

        if 'network' in backupRoute:
            # Connect to SeagateBackup
        if os.path.ismount('/Volumes/Seagate') == False:
                msg.log('Mounting Seagate Backup Hub', logMode)
                commandM = 'mount volume'
                smbPoint = '"smb://username:password@mediacentre/Seagate"'
                childM = pexpect.spawn("%s '%s %s'" %('osascript -e', commandM, smbPoint), timeout = None) 
                childM.expect(pexpect.EOF)
            else:
                msg.log('Seagate already mounted', logMode)


        # Use rsync to backup files
        commandR = 'rsync -avb '
    for s in v['%s exclude' %sourceComputer]:
        commandR = commandR + "--exclude '%s' " %s
    commandR = commandR + '--delete --backup-dir="../PreviousBackups/%s" ' %time.strftime("%d-%m-%y %H%M")

    commandR = commandR + '%s %s' %(v['%s %s source' %(sourceComputer, backupRoute)], v['%s %s destination' %(sourceComputer, backupRoute)])    
    msg.log(commandR, logMode)
    msg.log('Running rsync...rsync output below', logMode)
    child0 = pexpect.spawn(commandR, timeout = None) 

    # Handling command output
    # If no '\r\n' in readline() output, then EOF reached
    output = child0.readline()
    while '\r\n' in output:
        msg.log(output.replace('\r\n', ''), logMode + 's')
        output = child0.readline()

return


if __name__ == '__main__':
    # Create new threads
    threadMain = mainThreadClass()
    # Start new Threads
    threadMain.start()

logAndError.py

# to handle errors

import time
import sys
import threading


class logAndError:
    def __init__(self, errorAddress, logAddress):
    self.errorAddress = errorAddress
        self.logAddress = logAddress
        self.lock = threading.RLock()


def error(self, message, errMode, lineNumber=None, exitFlag=[0]):

    message = '%s: %s' %(time.strftime("%d/%m/%y %H:%M"), message)

    # p = print to screen, f = print to file,  e = end program
    if 'p' in errMode:
        print message
    if 'f' in errMode and 'e' not in errMode:
        errorFile = open(self.errorAddress, 'a')
        errorFile.write('%s\n' %message)
        errorFile.close()
    return


def log(self, logmsg, logMode):
    with self.lock:
        logmsg2 = '%s: %s' %(time.strftime("%d/%m/%y %H:%M"), logmsg)
        if 'p' in logMode:
            # s = simple (no date stamp)
            if 's' in logMode:
                print logmsg
            else:
                print logmsg2
        if 'f' in logMode:
            if 's' in logMode:
                logFile = open(self.logAddress, 'a')
                logFile.write('%s\n' %logmsg)
                logFile.close()
            else:
                logFile = open(self.logAddress, 'a')
                logFile.write('%s\n' %logmsg2)
                logFile.close()
    return

0 个答案:

没有答案