1

我正在尝试检测软件版本是否是最新的,并且我正在使用 Python 3.3 中的以下代码来执行此操作:

if str(version) in str(buildno):
    print("Your software version is up to date. \n")
else:
    print("Your software is out of date. Updating your software. \n")

但是,即使它是最新的,它也会不断更新软件。我还尝试了代码变体:

if str(version) in str(buildno) == True:
    print("Your software version is up to date. \n")
else:
    print("Your software is out of date. Updating your software. \n")
    if os == "Windows":
        subprocess.call("windowsUpgrade.sh", shell=True)

这也不起作用。我正在使用的方法是否可行,或者我应该采取另一种方法来解决这个问题?

>>> print(version)
4.3.0-18107
>>> print(buildno)
('4.3.0-18107', 1)

感谢您提供的任何答案。

4

4 回答 4

1

您的第二个变体将不起作用。如果您交换buildnoand ,第一个变体应该可以工作version

buildno = '4.3.0-18107'
version = ('4.3.0-18107', 1)

if str(buildno) in str(version):
    print("Your software version is up to date. \n")

我假设一个是字符串,另一个是元组,但它们可以是任何东西,因为我们只看到它们被打印出来,而不是你如何得到它们。

从它们的内容来看,这些变量名称有些误导,无论是否交换。

于 2013-02-28T13:11:20.707 回答
1

buildno是一个元组。您只需要第一项。那是:

if str(buildno[0]) in str(version):

甚至:

if str(buildno[0]) == str(version):

正如 Pavel Anossov 在评论中建议的那样。

在旁注中,您的第二种方法:

if str(buildno) in str(version) == True:

可以使用dis粗略翻译为:

if str(buildno) in str(version) and str(version) == True:

另外,请查看 DSM 对您的问题的评论。

使用这样的字符串包含可能会导致麻烦:“4.3.0-1”在“4.3.0-11”中,但可能不是最新的。根据您的版本编号策略,您可能需要创建一个整数元组进行比较。

于 2013-02-28T13:25:24.127 回答
1

好吧,这里使用的数据类型似乎有些混乱

元组到字符串:

str(('4.3.0-18107', 1)) = "('4.3.0-18107', 1)"

元组不在字符串中:

if "('4.3.0-18107', 1)" in '4.3.0-18107' # False

元组中的字符串

if '4.3.0-18107' in "('4.3.0-18107', 1)" # True 

输入字符串(第一个索引元组 = 字符串)

if '4.3.0-18107' in ('4.3.0-18107', 1)[0] # True

如果顺序无关紧要,您需要在转换为字符串之前索引元组 str(('4.3.0-18107', 1)[0]) 。您在上面的代码中所做的是将元组转换为字符串而不是版本。因此,Pavel Anossov 认为交换应该在这里起作用是正确的——至少它对我有用。

所以这最终奏效了(错过了一个空格):

buildno=buildno[0] 
version=str(version.strip()) 
buildno=str(buildno.strip()) 
if version == buildno

或更短:

if str(version).strip() == str(buildno[0]).strip():
if str(version).strip() in str(buildno[0]).strip():
于 2013-02-28T13:35:18.160 回答
1

由于您使用的是 Python 3,因此您可以使用PEP386distutils.version中描述的比较模块:

from distutils.version import LooseVersion as V

minimum_version = V(version)
current_version = V(buildno)

if current_version >= minimum_version:
    print("Your software version is up to date. \n")
else:
    print("Your software is out of date. Updating your software. \n")

还有一个StrictVersion类,但它似乎不适用于您的版本编号。

于 2013-02-28T13:36:23.747 回答