2010-01-09 4 views
2

질문이 있습니다. 나는 정말로 파이썬을 배우려고 노력 해왔다. 프로젝트의 경우 백업 서버용 ncurses GUI를 만들고 싶습니다. 내 백업 서버는 rdiff-backup을 실행하며, ncurses에 변수 이름을 입력하고 스크립트에 연결하려고합니다. 나는 많은 독서를하려고 노력했기 때문에 나는 바보 같은 질문을하지 않는다. 여기 Linux 용 Python 스크립팅 명령

스크립트를 실행하기위한 제 기능입니다 : 내가 원래 깔끔한 것이라고 생각 목록에 모든 변수를 추가, 그래서 난 그냥

script = rdiff + rdiffArgs 

말을 실행할 수 있습니다 무엇

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

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

os.system(script) 

모든 공간 연결없이이 작업을 수행하는 더 좋은 방법이 있습니까?

감사합니다.

편집 : 지금까지 전체 스크립트를 게시 해 드리겠습니다. 나는 매우 명확하지 있었고, 난 정말 당신의 도움과 인내

#!/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 또는 문자열을 원한다면 '.'([rdiff] + rdiffArgs). – abeyer

+0

그 결과리스트가됩니다. asker는 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는 백업이 파이썬

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

위의 백업이 최대의/etc /에/tmp를/백업을 작성하기 때문에 당신은 스크립트에서 rdiff는 가져올 수 있습니다. 그렇게하면 rdiff-backup에 대한 시스템 호출을 할 필요가 없습니다. 물론, 이것은 당신에게 달렸습니다. 시스템 호출을 만드는 것이 가끔 더 쉽습니다.

+0

오우 와우, 나는 그것을 몰랐습니다. 대단히 감사합니다 – Dan

+1

os.system 여기에 나쁜 선택입니다. 예를 들어, clientdir 또는 serverdir에 이름이 공백 인 경우 어떤 일이 발생하는지 고려하십시오. –

3

을 주셔서 감사합니다 당신은 경로

을 os.path.join 사용하여 가입 당신이 연결할 그래서 같은 문자열 "".join ([ 'A', 'b']) 또는 ','. 조인 ([ 'c', 'd'])

어느 부분이 어렵습니까? 나는이 질문을 이해하고 있는지 잘 모르겠다.

이것은이 질문이 정확합니까?

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

남자, 나는이 대답에 대해 +10 담당자를 얻는 것이 좋습니다. –

+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

흠, 하위 프로세스 모듈은 내가하고 싶은 일에 매우 적합합니다. Popen은 특히 좋아 보인다. 고맙습니다. – Dan

+0

예. Dan. os.system을 사용해서는 안됩니다. –