python找到软件唯一版本的方法
我在运行python 3.3的linux(RHEL 6.2)服务器上安装了一个软件的多个组件(我们称之为XYZ)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脚本
~$ 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()。
我们可以使用pythonsort
在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'])
并循环它返回的行。