在Linux中使用Python脚本命令
我有个问题。我一直在努力学习Python。为了一个项目,我想为我的备份服务器做一个ncurses图形界面。我的备份服务器运行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 个回答
3
你可以用 os.path.join 来连接路径。
你可以这样拼接字符串:像这样 "".join(['a', 'b']) 或者 ", ".join(['c', 'd'])。
哪部分让你觉得难呢?我不太明白这个问题的意思。
这就是你想问的内容吗?
script = rdiff + " ".join(rdiffArgs)
5
试着使用 subprocess 模块,并把参数作为列表传递,比如:
client = clientName + '@' + clientHost + '::' + clientDir
cmd = [rdiff, rdiffVerbosity, rdiffStatistics, client , serverDir]
p = Popen(cmd ", shell=True)
print os.waitpid(p.pid, 0)[1]
或者如果你已经有参数列表,可以像这样使用:
cmd = [rdiff] + args
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/备份到/tmp/backup。这样,你就不需要调用系统的rdiff-backup了。当然,这个由你决定。有时候调用系统命令会更简单