2010-06-04 3 views
0

안녕하세요!PyGTK 진도 바 command.getstatusoutput

저는 rsync의 진행 상황을 추적하여 PyGTK 진행률 표시 줄을 작동 시키려고했습니다. TO rsync 내가 commands.getstatusoutput을 사용하고 있습니다.

누구나 rsync의 진행 상황을 추적하고 PyGTK 진행률 막대에 표시하는 방법에 대한 아이디어가 있습니까?

감사합니다.

+0

당신이 이미 시도했다의 예를 게시 할 수 있습니까? – ptomato

답변

0

명령 .getstatusoutput은 상태 표시 줄에 전원을 공급하는 데 필요한 출력을 제공하지 않습니다. rsync에서 다른 방법으로 출력을 읽으십시오.

0

프로그래밍 방식으로을 추적 할 수 없으므로 최선의 방법은 출력 결과를 화면에 표시하고 진행 상황을 "추측"하는 것입니다.

첫 번째해야 할 일은 commands.getstatusoutput 대신 subprocess을 사용하는 것입니다. rsync의 표준 출력을 스크래핑하여 진행 상황을 추적 할 수 있기 때문에 훨씬 더 많은 제어권을 얻을 수 있습니다. 한 가지 해결책은 -v 옵션으로 rsync를 실행하는 것입니다.이 옵션은 전송 된 각 파일을 인쇄 한 다음 줄 바꿈 (실제로 필요하지 않은 다른 크래프트 플러스)을 출력합니다. rsync를 진행 추측하는 간단한 방법은 다음과 같이 할 것 :이 한 번에 rsync -v ... 한 줄의 출력을 읽고

import subprocess 
p = subprocess.Popen(['rsync', '-v', ..other rsync args..], shell=True, 
     stdout=subprocess.PIPE, close_fds=True) 
while p.stdout.readline(): 
    ... 
    # rsync has just "completed" an operation, i.e. it probably 
    # transferred a file. now would be a good time to update the 
    # ProgressBar. there are some options here, see below... 
    ... 
ret = p.wait() 
print "Rsync exited with code %d" % ret 

하고 while 루프에서 당신은 ProgressBar 적절한을 업데이트 . 그렇다면 질문은 어떤 종류의 업데이트입니까? ProgressBar에는 실제로 두 가지 모드가 있습니다. 하나는 불확정 목표를 향한 진행을 앞뒤로 "핑"하고 나머지는 알려진 목표를 향한 증가분을 기준으로 왼쪽에서 오른쪽으로 이동하는 모드입니다.

rsync가 손에 든 파일 목록 (예 : --list-only 또는 -vn)을 가져 와서 목표로 사용하는 것으로 추측 할 수 있지만 위험을 감수하기 때문에 본질적으로 오류가 발생하기 쉽습니다 목록을 수집하는 시간과 실제로 rsync를 실행할 때 사이에 보낸 사람의 파일 목록이 변경됩니다. 더 나은 해결책은 아마도 while 루프의 ProgressBar에있는 pulse()을 호출하여 백그라운드에서 일이 일어나고 있음을 나타낼 수 있습니다. 더 많은 정보를 표시하려면 p.stdout.readline()의 출력을 읽고 gtk.Label을 어딘가에 업데이트하여 전송할 파일을 나타낼 수 있습니다.

(참고 : 당신은 아마해야하는 rsync를 실행하면 위의 코드를 계정 오류 조건을 고려하지 않음)

+0

안녕하세요. 나는 이미 pulse()를 사용하고 있는데, 동기화 진행 상황을 표시하지 않고 ISO의 rsync이지만이 출력을 캡처 할 수없는 것 같습니다. "118803778 16 % 400.58kB/s 0 : 25 : 35 "로 설정하고 진행률 표시 줄에 표시하려면"16 % "를 가져옵니다. 그것을하는 방법에 대한 아이디어가 있다면 도움이 될 것입니다! 고맙습니다! – user175259