在Linux中使用Python脚本命令

2 投票
3 回答
2382 浏览
提问于 2025-04-15 17:49

我有个问题。我一直在努力学习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了。当然,这个由你决定。有时候调用系统命令会更简单

撰写回答