2017-04-27 52 views
0

我使用這個bash腳本從一個系統複製日誌文件到另一個系統如何使用python和glade創建進度條以將日誌文件從一個系統複製到另一個系統?

#!/bin/bash s="/var/log" 
d="/root/Directory" BACKUPFILE=scripts.backup.`date +%F`.tar.gz 
scp -r [email protected]$1:$s $2 rsync -chavzP --stats [email protected] 


filename=ug-$(date +%-Y%-m%-d)-$(date +%-T).tgz 
tar -czvf $2/$BACKUPFILE $s 
tar --create --gzip --file=$d$filename $s 
rm -rf /root/aaa/log 

而且我已經做了進度條這樣的代碼

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GObject 

class ProgressBarWindow(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="ProgressBar Demo") 
     self.set_border_width(10) 

     vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) 
     self.add(vbox) 

     self.progressbar = Gtk.ProgressBar() 
     vbox.pack_start(self.progressbar, True, True, 0) 

     button = Gtk.CheckButton("Show text") 
     button.connect("toggled", self.on_show_text_toggled) 
     vbox.pack_start(button, True, True, 0) 

     button = Gtk.CheckButton("Activity mode") 
     button.connect("toggled", self.on_activity_mode_toggled) 
     vbox.pack_start(button, True, True, 0) 

     button = Gtk.CheckButton("Right to Left") 
     button.connect("toggled", self.on_right_to_left_toggled) 
     vbox.pack_start(button, True, True, 0) 

     self.timeout_id = GObject.timeout_add(50, self.on_timeout, None) 
     self.activity_mode = False 

    def on_show_text_toggled(self, button): 
     show_text = button.get_active() 
     if show_text: 
      text = "some text" 
     else: 
      text = None 
     self.progressbar.set_text(text) 
     self.progressbar.set_show_text(show_text) 

    def on_activity_mode_toggled(self, button): 
     self.activity_mode = button.get_active() 
     if self.activity_mode: 
      self.progressbar.pulse() 
     else: 
      self.progressbar.set_fraction(0.0) 

    def on_right_to_left_toggled(self, button): 
     value = button.get_active() 
     self.progressbar.set_inverted(value) 

    def on_timeout(self, user_data): 
     """ 
     Update value on the progress bar 
     """ 
     if self.activity_mode: 
      self.progressbar.pulse() 
     else: 
      new_value = self.progressbar.get_fraction() + 0.01 

      if new_value > 1: 
       new_value = 0 

      self.progressbar.set_fraction(new_value) 

     # As this is a timeout function, return True so that it 
     # continues to get called 
     return True 

win = ProgressBarWindow() win.connect("delete-event", Gtk.main_quit) 
win.show_all() Gtk.main() 

但我不知道如何嵌入我的帶有此進度條碼的腳本。

+0

我只做了這個@JoséFonte –

回答

1

有一些解決此問題的方法,但您必須關心的主要問題是GUI和耗時的任務(長期任務)不是好朋友。大多數GUI框架使用他們的主循環來處理用戶輸入處理並繪製UI。這就是說,你必須從主UI中分離那些長期的任務,並且有一些方法可以做到這一點,無論是線程,異步方法等,它都將恢復到你選擇的語言處理這些問題的方式。

然後存在如何調用要跟蹤的操作系統功能的問題。可能最好的方法是通過編程在代碼中實現它們,但這將是一個耗時的工作。因此,使用shell腳本將是您的選擇,這樣做會導致一個問題:如何獲得這些命令的輸出?那麼,有popen,因爲你將使用python,那麼你必須用popen調用產生shell腳本。最好的辦法似乎是子流程。另一個改進是更好的定製bash腳本,它可以獲得一些先前對命令結果(成功或失敗)和條件/格式化輸出的分析。

希望你能看到我要去的地方...你必須解析通常進入控制檯的數據,解釋它並相應地更新UI。

我給你一個GTK窗口的一個進度條被脈衝的shell命令輸出(tree /)的每一行的一個簡單的例子:

import time 
import threading 
import subprocess 
import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import GLib, Gtk, GObject 


def app_main(): 
    win = Gtk.Window(default_height=50, default_width=300) 
    win.connect("delete-event", Gtk.main_quit) 
    win.connect("destroy", Gtk.main_quit) 

    progress = Gtk.ProgressBar(show_text=True) 
    win.add(progress) 

    def update_progress(i): 
     progress.pulse() 
     #progress.set_fraction (i/100.0) # use this for percentage 
     #progress.set_text(str(i)) 
     return False 

    def example_target(): 
     i = 0 # can be used to pass percentage 
     proc = subprocess.Popen(['tree', '/'],stdout=subprocess.PIPE) 
     while True: 
      line = proc.stdout.readline() 
      if line != '': 
       time.sleep(0.1) # output is too quick, slow down a little :) 
       GLib.idle_add(update_progress, i) 
      else: 
       break 

    win.show_all() 

    thread = threading.Thread(target=example_target) 
    thread.daemon = True 
    thread.start() 


if __name__ == "__main__": 
    app_main() 
    Gtk.main() 

在上面的例子中,我們使用線程。 shell命令,您可以在控制檯上嘗試,在您的磁盤上轉儲文件夾結構樹。可以是任何事情,但目標是有一個長期的任務。由於我們無法跟蹤進度,因此酒吧將處於活動模式,並且我們會爲每一行進行脈衝調整,但如果您可以跟蹤進度,則可以使用set_fraction方法。

希望這會引導你走向正確的方向。 GL

+0

該代碼是工作文件,但我仍然沒有得到如何可以將此代碼與我的bash腳本合併? @JoseFonte –

+0

這是在Popen電話。在這裏,何塞以「樹/」命令爲例。確實是 – liberforce

+0

。您可以從活動模式開始指示待處理任務,然後轉到下一步,解析輸出並指示實際進度。由於您的腳本使用參數,您必須將它們傳遞給python([檢查此](http://stackoverflow.com/questions/4033723/how-do-i-access-command-line-arguments-in-python))。然後在你的shell腳本中使用這些參數([check this](https://docs.python.org/3.5/library/subprocess.html))。 –

相關問題