2010-01-09 3 views
2

У меня вопрос. Я действительно пытался узнать Python. Для проекта я хочу создать графический интерфейс ncurses для моего резервного сервера. Мой резервный сервер запускает rdiff-backup, и я хочу, чтобы ncurses принимали имена переменных и вставляли их в свой скрипт. Я пытался сделать много чтения, поэтому я не задаю глупых вопросов.Scripting Python для команд Linux

Вот моя функция для запуска скрипта:

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 

Есть ли лучший способ сделать это без всякой конкатенации пространства?

Спасибо за вашу помощь

EDIT: Позвольте мне опубликовать весь сценарий до сих пор. Я был не очень понятно, и я очень ценю вашу помощь и терпение

#!/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» на передний план? Я думаю, что вы ищете: script = [rdiff] + rdiffArgs Или '.join ([rdiff] + rdiffArgs), если вы хотите, чтобы это была строка. – abeyer

+0

Это приведет к списку. Вероятно, искатель хочет получить результирующую строку, потому что это то, что было передано в os.system(). –

+1

'os.system() 'не следует использовать, поэтому любой ответ, который позволяет это, следует считать неправильным. –

ответ

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) 

вышеуказанные спины вверх/и т.д./в/TMP/резервного копирования. Таким образом, вам не нужно выполнять системный вызов rdiff-backup. Конечно, это зависит от вас. системный вызов иногда бывает проще

+0

О, ничего себе, я этого не знал. Большое спасибо – Dan

+1

os.system - плохой выбор. например, подумайте о том, что произойдет, если clientdir или serverdir имеет пробел в имени –

3

Вы присоединяетесь пути с помощью os.path.join

Вы сцепить строки, как так: «» .join ([ «а», 'b']) или "," .join (['c', 'd'])

Какая часть сложна? Я не уверен, что понимаю вопрос 100%

Это правда?

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

Человек, мне лучше получить +10 rep для этого ответа. –

+0

Спасибо !!!!!!!!! –

+0

Спасибо lpthnc за ваш вклад, я принял его к сердцу :) – Dan

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

Хм, модуль подпроцесса выглядит очень хорошо для того, что я хочу сделать. Попэн выглядит особенно красиво. Спасибо – Dan

+0

да Дэн. и вы не должны использовать os.system –