脚本Python for Linux命令

时间:2010-01-09 03:23:18

标签: python linux

我有一个问题。我一直在努力学习Python。对于一个项目,我想为我的备份服务器创建一个ncurses GUI。我的备份服务器运行rdiff-backup,我想让ncurses接收变量名并将它们插入到我的脚本中。我一直在尝试做很多阅读,所以我不会问愚蠢的问题。

这是我运行脚本的功能:

def runScript():
# Cannot concatenate 'str' and 'list' objects
#script = rdiff + rdiffArgs

script = rdiff + ' ' + rdiffVerbosity + ' ' + rdiffStatistics \
         + ' ' + clientName + '@' + clientHost + '::' + clientDir \
         + ' ' + serverDir

os.system(script)

我最初想的是将所有变量添加到列表中,所以我可以运行说

script = rdiff + rdiffArgs

在没有所有空间连接的情况下,有更好的方法吗?

感谢您的协助

编辑:到目前为止,让我发布整个脚本。我不太清楚,我非常感谢你的帮助和耐心

  #!/usr/bin/env python



import os
import smtplib


# Global variables
rdiff = '/usr/bin/rdiff-backup'
rdiffVerbosity = '-v5'
rdiffStatistics = '--print-statistics'
emailSmtp = 'smtp.gmail.com'
smtpPort = '465'
emailUsername = 'reports'
emailPassword = '3kc9dl'
emailTo = 'user@domain.com'
emailFrom = 'internal@domain.com'
serverName = 'root'
serverHost = 'SV-Datasafe'
serverDir = '/srv/backup/SV-Samba01'
clientName = 'root'
clientHost = 'SV-Samba01'
clientDir = '/srv'
rdiffArgs = rdiffArgs = [rdiffVerbosity, rdiffStatistics, \
                         clientName + '@' + clientHost + '::' \
                         +clientDir + ' ' + serverDir]
time = ''
dateStamp = datetime.now()



def sendEmail():
    subject = dateStamp + clientName
    body = clientDir + ' on ' + clientHost + ' backed up to ' + serverName + \
           ' in the directory ' + serverDir + ' on ' + dateStamp
    message = """\
    From: %s
    To: %s
    Subject: %s
    %s
    """ % (emailFrom, emailTo, subject, body)


    deliverEmail = smtplib.SMTP(emailSmtp, port=smtpPort)
    deliverEmail.login(emailUsername, emailPassword)

def runScript():
    # Cannot concatenate 'str' and 'list' objects
    #script = rdiff + rdiffArgs

    script = rdiff + ' ' + rdiffVerbosity + ' ' + rdiffStatistics \
             + ' ' + clientName + '@' + clientHost + '::' + clientDir \
             + ' ' + serverDir

    os.system(script)

    # TODO:: Logging

3 个答案:

答案 0 :(得分:5)

您可以使用格式说明符

def runScript():
    script = "%s %s %s@%s %s::%s %s" %(rdiff,rdiffVerbosity,rdiffStatistics,clientName,clientHost,clientDir,serverDir)    
    os.system(script)

或者说你的rdiffArgs已经在列表中了

rdiffArgs = [rdiffVerbosity,rdiffStatistics,clientName,clientHost,clientDir,serverDir]

你可以用空格加入

rdiffArgs = ' '.join(rdiffArgs)

最后,您可能想知道,您可以在脚本中导入rdiff,因为rdiff-backup是用Python编写的

from rdiff_backup.Main import Main as backup
task=['/etc', '/tmp/backup']
backup(task)

以上备份/ etc / to / tmp / backup。这样,您就不必对rdiff-backup进行系统调用。当然,这取决于你。进行系统调用有时更容易

答案 1 :(得分:5)

尝试使用subprocess模块并将参数作为列表传递,例如

client = clientName + '@' + clientHost + '::' + clientDir
cmd = [rdiff, rdiffVerbosity, rdiffStatistics, client , serverDir]
p = Popen(cmd ", shell=True)
print os.waitpid(p.pid, 0)[1]

或者如果已经将args作为列表使用类似的东西

cmd = [rdiff] + args

答案 2 :(得分:3)

您使用os.path.join

加入路径

你像这样连接字符串:“”。join(['a','b'])或​​“,”。join(['c','d'])

哪个部分很难?我不确定我是否理解100%的问题

这是吗?

script = rdiff + " ".join(rdiffArgs)