2013-02-10 1 views
7

私はpython_aptが提供するこのコードをチェックアウトしていますが、それは少し時代遅れのように表示されます。apt.progressクラスを使ってpython_aptのcommit()の進捗を確認する方法は?

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

私はここで行うしようとしてるすべてがcommit()方法の進行を追跡です。現在、commit()と呼び出してfprogressiprogressを渡すと、pkg_listのすべてのパッケージが正しくダウンロードされていることがコンソールでわかります。この問題は今後発生します。

プログラムは実行を継続し、私はそれがすべきだと信じてdpkg_status_change()をトリガーしませんか?

複数のパッケージのインストールが成功したかどうかわからないのですか?どうやらpython_aptcommit()で作業

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... 

答えて

2

痛みですが、私はすべてが終了するのを(それがあるべきように)待ってから、パッケージが実際にアップグレードされたことを確認するために、最後に出力を解析するためにsubprocessを使用して終了しました。 _apt_update()

私は、システムがapt-get updateを試みる前にオンラインで確認してください、そして_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 
に渡されたパッケージの彼インストールを続行
関連する問題