2013-02-10 11 views
7

Ben python_apt tarafından sağlanan bu kodu kontrol ediyorum ama biraz modası geçmiş gibi görünüyor:apt.progress sınıfını kullanarak python_apt'daki commit() işleminin ilerleyişi nasıl denetlenir?

https://github.com/jolicloud/python-apt/blob/master/doc/examples/inst.py

Burada yapmak çalışılıyor Tüm commit() yöntemin ilerlemesini takip etmek; Şu anda commit() ve fprogress ve iprogress numaralarını girdiğimizde konsolda, pkg_list'daki tüm paketlerin doğru şekilde karşıdan yüklendiğini görebiliyorum, sorun bundan sonra görünüyor.

Program yürütmeyi sürdürüyor ve olması gerektiği gibi dpkg_status_change()'u tetiklemiyor mu?

Birden çok paketin yüklenmesinin başarılı olup olmadığını bilmem mümkün değil mi? Görünüşe python_aptcommit() ile çalışan

import apt 
from apt.progress.base import InstallProgress 

    class InstallStatusUpdate(InstallProgress): 

      def conffile(self, current, new): 
       print "conffile prompt: %s %s" % (current, new) 

      def processing(self, pkg, stage): 
       print "Processing ", pkg, " stage: ", stage 

      def error(self, pkg, errormsg): 
       print "Package ", pkg, " error: ", errormsg 

      def finish_update(self): 
       print "Installation is complete" 

      def status_change(self, pkg, percent, status): 
       print "Package: ", pkg, " at ", percent, " -> ", status 

      def dpkg_status_change(self, pkg, status): 
       print "Package ", pkg, ", Status: ", status 



    def install_updates(self, pkg_list): 
      fprogress = apt.progress.TextFetchProgress() 
      iprogress = InstallStatusUpdate() 

      cache_tmp = apt.Cache() 
      cache_tmp.update() 
      cache_tmp.open(None) 

      for pkg in pkg_list: 
       try: 
        self.pkgname = cache_tmp[pkg.name] 
        if self.pkgname.is_installed and self.pkgname.is_upgradable: 
         self.pkgname.mark_upgrade() 
        else: 
         self.pkgname.mark_install() 
       except Exception as e: 
        print e.message 

      result = self.pkgname.commit(fprogress, iprogress) 
      #Maybe i'm doing something wrong here but result always = None... 

cevap

2

bir acıdır, her şeyi bitirmek için (olması gerektiği gibi) beklemek ve paket gerçekten yükseltildi doğrulamak için sonunda çıkış ayrıştırmak için subprocess kullanarak sona erdi. _apt_update() yılında

i sistem apt-get update denemeden önce çevrimiçi olduğundan emin olmak için kontrol et, sonra _apt_install().

def _apt_update(self): 
     import urllib2 

     try: 
      response = urllib2.urlopen('http://74.125.113.99', timeout=1) 
      #We have internet access 
      subprocess.Popen(['apt-get', 'update']) 
      return True 
     except urllib2.URLError as err: pass 
     return False 

def _apt_install(self, pkg, update=True): 
     upgraded = 0 

     if update == True: 
      self._apt_update() 

     proc = subprocess.Popen(['apt-get', 'install', pkg, "-y"], stdout=subprocess.PIPE) 
     for line in proc.stdout: 
      if "upgraded" in line and "newly installed" in line and "to remove" in line: 
       values = line.split(",") 
       for pos in values: 
        key, value = pos.split(" ") 
        if value == "upgraded": 
         upgraded = int(key) 
        break 

     print "Upgraded OK (", upgraded, ")" 
     if upgraded > 0: 
      return True 
     else: 
      return False 
geçirilen paketin o yükleme işlemine devam
İlgili konular