2010-01-09 8 views
2

J'ai une question. J'ai vraiment essayé d'apprendre Python. Pour un projet, je souhaite créer une interface graphique ncurses pour mon serveur de sauvegarde. Mon serveur de sauvegarde exécute rdiff-backup, et je veux avoir les ncurses prennent en noms de variables et de les brancher dans mon script. J'ai essayé de faire beaucoup de lecture, donc je ne pose pas de questions stupides.script Python pour Linux commandes

Voici ma fonction pour exécuter le script:

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

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

os.system(script) 

Ce que je pensé à l'origine serait bien était d'ajouter toutes les variables dans une liste, donc je pouvais courir dire

script = rdiff + rdiffArgs 

Y a-t-il une meilleure façon de le faire sans toute la concaténation d'espace?

Merci pour votre aide

EDIT: Permettez-moi à ce jour posterai le script entier. Je n'étais pas très clair et je vous remercie de votre aide et la patience

#!/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

Je ne sais pas exactement ce que votre question est, mais je crois comprendre que vous voulez rdiffArgs être une liste de chaînes, et ajouter le littéral 'rdiff' à l'avant de cela? Je pense que vous cherchez: script = [rdiff] + rdiffArgs Ou '' .join ([rdiff] + rdiffArgs) si vous le voulez comme une chaîne. – abeyer

+0

Cela aboutirait à une liste. Le demandeur souhaite probablement la chaîne résultante car c'est ce qui est fourni à os.system(). –

+1

'os.system() 'ne devrait pas être utilisé, donc toute réponse qui permet ceci devrait être considérée comme incorrecte. –

Répondre

5

vous pouvez utiliser spécificateurs

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

ou dire votre rdiffArgs est déjà dans une liste

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

vous pouvez les joindre à un espace

rdiffArgs = ' '.join(rdiffArgs) 

enfin , juste pour que vous puissiez vouloir savoir, vous pouvez importer rdiff dans votre script, depuis rdiff-backup est écrit en Python

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

les ci-dessus le dos/etc/vers/tmp/backup. De cette façon, vous n'avez pas besoin de faire un appel système à rdiff-backup. Bien sûr, cela dépend de vous. faire appel système est parfois plus facile

+0

Oh wow, je ne le savais pas. Merci beaucoup – Dan

+1

os.system est un mauvais choix ici. par exemple considérons ce qui se passe si le clientdir ou le serverdir a un espace dans le nom –

3

Vous rejoignez les chemins en utilisant os.path.join

Vous concaténer des chaînes comme ceci: « » .join ([ « a », 'b']) ou "" .join ([ 'c', 'd'])

Quelle partie est difficile? Je ne suis pas sûr que je comprends la question 100%

Est-ce cela?

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

Man, je ferais mieux d'obtenir +10 rep pour cette réponse. –

+0

Merci !!!!!!!!! –

+0

Merci lpthnc pour votre contribution, je l'ai pris à cœur :) – Dan

5

essayer d'utiliser le module subprocess et passer des arguments liste par exemple

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

ou si ont args déjà que la liste utiliser quelque chose comme ça

cmd = [rdiff] + args 
+0

Hmm, le module de sous-processus semble très bon pour ce que je veux faire. Popen a l'air particulièrement gentil. Merci – Dan

+0

oui Dan. et vous ne devriez pas utiliser os.system –

Questions connexes