Python-apt:安装具有特定版本的软件包

时间:2015-12-08 17:17:58

标签: python apt

我正在使用python-apt来安装debian软件包。我需要能够使用特定版本安装它,但无法弄清楚如何。根据{{​​3}}的文档:

  

只需分配一个Version()对象,它就会被设置为候选版本。

目前我正在按以下方式安装软件包:

import apt
cache = apt.cache.Cache()
pkg = cache['byobu']  # Or any random package for testing
pkg.mark_install()
cache.commit()

到目前为止,我发现设置版本的唯一方法就是通过这样的apt.apt_pkg,但我不知道如何从这里开始:

pkg_name = 'byobu'
cache = apt.cache.Cache()
pkg = cache[pkg_name]
version = apt.apt_pkg.Cache()[pkg_name].version_list[1]  # 5.77-0ubuntu1
new_version = apt.package.Version(pkg, version)  # 5.77-0ubuntu1
new_version.package.candidate  # 5.77-0ubuntu1.2 <---
new_version.package.mark_install()
cache.commit()  # Returns True

最终的版本是已安装的版本,cache.commit()只返回True而不做任何事情(可能是因为候选版本是已安装的版本)。我做错了什么?

1 个答案:

答案 0 :(得分:2)

在以结构化的方式写下来后,我终于明白pgk.candidate可以被new_version覆盖。我之前尝试过,但没有考虑apt.package.Versionapt.cache.Cacheapt.apt_pkg.Cache的混合。

我要离开这里让其他人在将来使用。最终样本代码:

pkg_name = 'byobu'
cache = apt.cache.Cache()
package = cache[pkg_name]
version = apt.apt_pkg.Cache()[pkg_name].version_list[1]
candidate = apt.package.Version(package, version)
package.candidate = candidate
package.mark_install()
cache.commit()

修改

感觉很愚蠢,意识到我不需要构建版本,但可以在版本列表中使用它... 记住小孩,不要在醉酒时编码。

更好的最终代码:

cache = apt.cache.Cache()
package = cache[package_name]
candidate = package.versions.get(version)
package.candidate = candidate
package.mark_install()
cache.commit()