如何使用 Python-apt API 安装软件包

26

我在Python方面是个新手,因此我在此先请求谅解 :). 话虽如此,我正在尝试编写一个脚本,其中包括安装一些Linux软件包。最初我尝试按照这里所述使用subprocess。虽然这样最终可以工作,但我偶然发现了python-apt API,由于我不喜欢重复造轮子,所以我决定尝试一下。

问题出现在试图找到使用python-apt来安装软件包的示例/教程时。通过搜索文档,我找到了PackageManager类,其中有一些安装软件包的方法。我尝试了一些简单的代码来让它工作:

apt_pkg.PackageManager.install("python")

这似乎不那么容易实现,安装方法需要apt_pkg.PackageManager而不是普通的字符串。因此,进一步查看时,我找到了这个例子,看起来很有希望,但我有些犹豫使用,因为我并不真正理解其中发生的一些事情。

那么,是否有人尝试过使用python-apt来安装软件包,还是应该使用旧式的subopen方式?

谢谢!


python-apt 似乎已经停止更新,大部分链接已经失效,根据 pypi 的信息,该软件包自 2012 年发布以来就没有更新过。 - DBX12
1
@DBX12 我认为只是pypi包没有得到维护。一个更新的版本在Debian仓库中。对于py2(https://packages.debian.org/stretch/python-apt)或者py3(https://packages.debian.org/stretch/python3-apt),可以使用单独的软件包。 - Jeremy Davis
仅检查是否已安装,而不是:https://dev59.com/5HA75IYBdhLWcg3wRWuc - Ciro Santilli OurBigBook.com
1个回答

52

建议使用Debian软件包中的python-apt中的apt模块。这是对底层C/C++libapt-xxx库的高级封装,并具有Pythonic接口。

以下是安装libjs-yui-doc软件包的示例脚本:

#!/usr/bin/env python
# aptinstall.py

import apt
import sys

pkg_name = "libjs-yui-doc"

cache = apt.cache.Cache()
cache.update()
cache.open()

pkg = cache[pkg_name]
if pkg.is_installed:
    print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
    pkg.mark_install()

    try:
        cache.commit()
    except Exception, arg:
        print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))
与使用 apt-get 相同,必须具备超级用户权限才能访问和修改 APT 缓存。
$ sudo ./aptinstall.py

如果您正在尝试作为较大脚本的一部分进行软件包安装,最好只在必要的最短时间内提升至root特权。

您可以在/usr/share/pyshared/apt/progress/gtk2.py:_test()函数中找到一个小例子,展示如何使用GTK前端安装软件包。


1
这正是我在寻找的!谢谢Austin,你真是一个超级明星:D - AlejandroVK
2
cache.update() 之后,您可能想要调用 cache.open(),以利用新的缓存。否则,将使用旧缓存,这可能会导致奇怪的错误。 - lrsjng
1
有没有办法捕获安装的进度,然后在安装完成后执行其他操作? - answerSeeker
您可以通过子类化InstallProgress来处理未安装/已安装操作的进度,如此处所述:https://github.com/excid3/python-apt/blob/master/doc/examples/inst.py - ACK_stoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接