2010-01-09 109 views
2

我有一個問題。我一直在努力學習Python。對於一個項目,我想爲我的備份服務器製作一個ncurses GUI。我的備份服務器運行rdiff-backup,我想讓ncurses採用變量名稱並將它們插入到我的腳本中。我一直在努力做大量的閱讀,所以我不問愚蠢的問題。用於Linux命令的腳本Python

這裏是我的運行腳本功能:

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 = '[email protected]' 
emailFrom = '[email protected]' 
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

不知道你的問題是什麼,但是從我的理解,你想rdiffArgs是一個字符串列表,並添加文字'rdiff'到那個前面?我認爲你正在尋找: 腳本= [rdiff] + rdiffArgs或''.join([rdiff] + rdiffArgs)如果你想它作爲一個字符串。 – abeyer 2010-01-09 03:30:54

+0

這將導致一個列表。提問者可能想要得到的字符串,因爲這是送入os.system()的東西。 – 2010-01-09 03:32:07

+1

'os。system()'不應該被使用,所以任何答案都可以被認爲是不正確的。 – 2010-01-09 04:11:10

回答

5

您可以使用格式說明

def runScript(): 
    script = "%s %s %[email protected]%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進行備份是用Python寫

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

上述可備份的/ etc /到/ tmp /備份。這樣,您不必對rdiff-backup進行系統調用。當然,這取決於你。使系統調用有時更容易

+0

哦哇,我不知道。非常感謝 – Dan 2010-01-09 04:33:23

+1

os.system在這裏是一個不錯的選擇。例如考慮如果clientdir或serverdir在名稱中有一個空格 – 2010-01-09 11:18:54

3

您加入使用os.path.join

路徑,則連接字符串,像這樣:「」。加入([「一」, 'b'])或​​「,」.join(['c','d'])

哪個部分很難?我不確定我是否理解這個問題100%

是這樣嗎?

script = rdiff + " ".join(rdiffArgs) 
+0

男人,我最好得到+10代表這個答案。 – 2010-01-09 03:36:05

+0

謝謝!!!!!!!!! – 2010-01-09 04:53:29

+0

感謝lpthnc爲你的輸入,我已經把它放在心上:) – Dan 2010-01-09 05:01:15

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 
+0

嗯,那麼子流程模塊看起來非常適合我想要做的事情。 Popen看起來特別好。謝謝 – Dan 2010-01-09 05:02:16

+0

是的丹。你不應該使用os.system – 2010-01-09 06:30:25