python找到软件唯一版本的方法

python找到软件唯一版本的方法,python,linux,sorting,split,Python,Linux,Sorting,Split,我在运行python 3.3的linux(RHEL 6.2)服务器上安装了一个软件的多个组件(我们称之为XYZ) ~$ rpm -qa | grep -i xyz XYZman-5.3.1.9-1.x86_64 XYZconnect-5.3.1.9-1.x86_64 XYZconsole-5.3.1.9-1.x86_64 XYZnode-5.3.1.9-1.x86_64 我正在尝试将我的安装/升级脚本从shell转换为python。为此,我需要获取版本号,但只能获取一次。在我的python脚本

我在运行python 3.3的linux(RHEL 6.2)服务器上安装了一个软件的多个组件(我们称之为XYZ)

~$ rpm -qa | grep -i xyz
XYZman-5.3.1.9-1.x86_64
XYZconnect-5.3.1.9-1.x86_64
XYZconsole-5.3.1.9-1.x86_64
XYZnode-5.3.1.9-1.x86_64
我正在尝试将我的安装/升级脚本从shell转换为python。为此,我需要获取版本号,但只能获取一次。在我的python脚本中,我添加了以下代码

>>> cmd = ("rpm -qa | grep -i xyz | awk -F[-] '{print $2}' | sort -u")
>>> sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> (out, err) = sp.communicate()
>>> rcode = sp.returncode

>>> print (out.decode('utf-8').replace('\n', '')
>>> 5.3.1.9
我想在这里使用基于python的命令,而不是
awk
sort
。我想我们可以对
awk
使用
split()。

我们可以使用python
sort
在shell中获得唯一值,如
sort-u

您可以在split()方法中定义要使用的delimeter,如下所示:

>>> cmd = ("rpm -qa | grep -i xyz")
>>> sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> (out, err) = sp.communicate()
>>> v = []
>>> for line in out.splitlines():
...     if line.split("-")[1] not in v:
...         v.append(line.split("-")[1])
...
>>> print v
['5.3.1.9']

您可以定义要在split()方法中使用的delimeter,如下所示:

>>> cmd = ("rpm -qa | grep -i xyz")
>>> sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> (out, err) = sp.communicate()
>>> v = []
>>> for line in out.splitlines():
...     if line.split("-")[1] not in v:
...         v.append(line.split("-")[1])
...
>>> print v
['5.3.1.9']

在我看来,您似乎在试图将python硬塞进一个不属于它的进程中。显示的5行中有4行是为了让bash与python对话。我强烈建议您在bash端执行bash操作,然后将所需的任何参数传递到python中

考虑到所有这些,如果你仍然在寻找“如何得到一个只有独特元素的iterable?”答案是。集合的关键函数是(或者如果您不确定元素是否在集合中),并将一个集合合并到另一个集合中。或者,如果您有一个非唯一项的列表,并且希望它们是唯一的,那么构建一个新的集合:
foo=set(my\u non\u unique\u list)


请注意,集合是无序的。既然您在谈论排序,我认为排序不是您的问题,所以集合应该是您所需要的。

我觉得您试图将python硬塞进一个不属于它的进程中。显示的5行中有4行是为了让bash与python对话。我强烈建议您在bash端执行bash操作,然后将所需的任何参数传递到python中

考虑到所有这些,如果你仍然在寻找“如何得到一个只有独特元素的iterable?”答案是。集合的关键函数是(或者如果您不确定元素是否在集合中),并将一个集合合并到另一个集合中。或者,如果您有一个非唯一项的列表,并且希望它们是唯一的,那么构建一个新的集合:
foo=set(my\u non\u unique\u list)


请注意,集合是无序的。既然您在谈论排序,我不认为排序是您关心的问题,所以集合应该是您所需要的。

将整个输出从命令行捕获到python变量中是无效的。您最好优化您的命令行管道:使用
rpm-qa | awk
甚至只使用
子流程都是可行的。检查_输出(['rpm','-qa'])
并循环它返回的行。将整个输出从命令行捕获到python变量中是无效的。您最好优化您的命令行管道:使用
rpm-qa | awk
甚至只使用
子流程都是可行的。检查_输出(['rpm','-qa'])
并循环它返回的行。