有没有办法让python显示服务器上安装的所有apt / yum软件包?我有一个程序,只能抓取我指定的一个包,但我想知道是否有python-yum和python-apt之类的apt-show-versions / yum check-update模块在python中单包。
感谢。
编辑:
以下是我目前的代码:
# For finding the package version and using the package name -i
def aptpkg(package_name):
cache = apt.Cache()
pkg = cache[package_name]
host = subprocess.Popen('hostname', stdout=subprocess.PIPE, universal_newlines=True).stdout.read().strip()
if pkg.is_installed:
print host
print 'Current ' + package_name + ' installed:', pkg.installed.version
con.execute("insert into ansible_packagelist(date, host, package_name, installed_version) values (current_timestamp,%s,%s,%s)", (host, package_name, pkg.installed.version,))
else:
print host, package_name + ' is not installed on this system.\n'
if pkg.is_upgradable:
print 'Upgradeable version of ' + package_name + ' :', pkg.candidate.version
con.execute("update ansible_packagelist set upgradeable_version = %s where package_name = %s", (pkg.candidate.version, package_name))
db.commit()
答案 0 :(得分:5)
这是pythonic方式:
import apt
cache = apt.Cache()
for mypkg in apt.Cache():
if cache[mypkg.name].is_installed:
print mypkg.name
对于yum,我首先需要登录RH / Centos系统。 但你可以看一下yum库,你会找到像'rpmdb.searchNevra'这样的东西
答案 1 :(得分:3)
使用subprocess
运行shell命令。
from subprocess import call
for apt:call(["dpkg", "-l"])
为yum:call(["yum list installed"])
答案 2 :(得分:1)
maxadamo的回答是正确的,但Cache
初始化了两次,我不知道原因。
您只能实例化一个缓存,在其上循环并直接在for循环中访问pkg
。您不需要额外的查找,因为您已经可以访问pkg
的属性。
所以这是一种更多的Pythonic方式:
import apt
cache = apt.Cache()
for pkg in cache:
if pkg.is_installed:
print pkg.name
答案 3 :(得分:1)
import re
with open("/var/lib/dpkg/status", "r") as f:
status = f.read()
packages_installed = re.findall("Package: (.*)\nStatus: install ok installed", status)
您必须阅读有关dpkg包状态的信息。执行官:" man dpkg"并转到"有关包装的信息"部分。
我认为使用模块来解决某些问题是不必要的。它创建依赖(我不喜欢)。 "简单"脚本比使用apt模块的脚本更快。 比较 - :
a.py:
import re
with open("/var/lib/dpkg/status", "r") as f:
status = f.read()
packages_installed = re.findall("Package: (.*)\nStatus: install ok installed", status)
b.py:
import apt
cache = apt.Cache()
for pkg in cache:
pass
# if pkg.is_installed:
# print pkg.name
时间:
/tmp » time python a.py
python a.py 0,04s user 0,01s system 58% cpu 0,075 total
/tmp » time python b.py
python b.py 3,07s user 0,09s system 75% cpu 4,205 total
如果唯一目标是获取已安装软件包的列表,则不需要使用apt模块。其他方式是使用subprocess和ejecute" dpkg -l",但我不是exec的朋友。
答案 4 :(得分:0)
如果有人想在“ import re”中使用答案
收到通知: 有些包有另一个标头
var query2 = from product in dbContext.Products
join eventProduct in dbContext.EventProducts
on new { pIndex = product.index, eIndex = currentEvent.index }
equals new { pIndex = eventProduct.Product.index, eIndex = eventProduct.Event.index } into temp
from eventProduct in temp.DefaultIfEmpty()
select new {
Product = product,
EventProduct = eventProduct
};
var results = query2.ToList();
foreach(var r in results)
{
r.EventProduct = r.EventProduct != null
? r.EventProduct
: new EventProduct { .... set default values}
}
因此此代码不起作用
如果您仍要使用它,则需要进行如下更改:
Package: perl-base
Essential: yes
Status: install ok installed
答案 5 :(得分:0)
您可以使用pip list
或pip list > requirements.txt
并手动处理文件以生成需求。