我有一个问题。我一直在努力学习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
答案 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)