使用 python 检查 CMake 版本
Check CMake version using python
我是第一次构建项目,真的很困惑。我通过使用 gitmodules 包含了一个项目,我正在使用 Visual Studio 并且我想在我自己的项目中静态 link 该项目。问题是该项目没有 Visual Studio 解决方案,所以我只剩下 运行ning CMake 了。但是,我通过查看 GitHub 在网上看到人们使用脚本来 运行 构建的所有先决条件。所以我制作了批处理脚本和 python 脚本,并且到目前为止进展顺利。
但我无法在网上找到显示如何使用 Python 获取 CMake 版本的任何地方。
我希望 Python 脚本检测是否安装了 CMake,如果安装了则检查其版本。
当前我的 Python 代码如下所示
if cmake --version <= 3.22.1:
exit(1)
虽然这给了我错误:SyntaxError: invalid syntax
终端中的 运行 cmake --version
显示了预期的版本。
“cmake 版本 3.22.1”
我正在尝试从调用中获取 CMake 版本以用于 python 中的 if 语句,而不是仅调用 python 中的 cmake --version
。
有人知道怎么做吗?
另外,如果这是 XY 问题,请告诉我。我不知道我在做什么!
使用Subprocess
subprocess = subprocess.Popen("cmake --version", shell=True, stdout=subprocess.PIPE)
subprocess_return = subprocess.stdout.read()
print(subprocess_return)
您现在在 subprocess_return
变量中有了命令的输出,
现在您可以解析它以获取版本号。
import subprocess
import re
try:
msg = subprocess.Popen("cmake --version", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read().decode()
# guess
versions = msg.split()[2]
pat = re.compile(r'[0-9]\.[0-9].+\.[0-9]')
if pat.match(versions):
print(versions.split("."))
else:
print("Invalid!")
except:
print("Invalid!")
您可以像这样检查 CMake 版本与 3.22.1 的对比:
import subprocess
from packaging import version
def get_cmake_version():
output = subprocess.check_output(['cmake', '--version']).decode('utf-8')
line = output.splitlines()[0]
version = line.split()[2]
return(version)
if version.parse(get_cmake_version()) < version.parse("3.22.1"):
exit(1)
get_cmake_version()
运行 cmake --version
,使用 check_output()
获取其输出。然后结合 split()
和 splitlines()
,它会得到第一行的第三个单词和 returns。然后我们从打包模块中用version.parse
解析get_cmake_version()
返回的版本号,并与3.22.1.
进行比较
请注意,如果未安装 CMake,上述 subprocess.check_output()
调用会抛出 FileNotFoundError。但这没有记录在案。 check_output()
的文档说它可以抛出 CalledProcessError 但没有提到 FileNotFoundError.
您可能希望使用 try/except 来处理这两个错误。
我是第一次构建项目,真的很困惑。我通过使用 gitmodules 包含了一个项目,我正在使用 Visual Studio 并且我想在我自己的项目中静态 link 该项目。问题是该项目没有 Visual Studio 解决方案,所以我只剩下 运行ning CMake 了。但是,我通过查看 GitHub 在网上看到人们使用脚本来 运行 构建的所有先决条件。所以我制作了批处理脚本和 python 脚本,并且到目前为止进展顺利。
但我无法在网上找到显示如何使用 Python 获取 CMake 版本的任何地方。
我希望 Python 脚本检测是否安装了 CMake,如果安装了则检查其版本。
当前我的 Python 代码如下所示
if cmake --version <= 3.22.1:
exit(1)
虽然这给了我错误:SyntaxError: invalid syntax
运行 cmake --version
显示了预期的版本。
“cmake 版本 3.22.1”
我正在尝试从调用中获取 CMake 版本以用于 python 中的 if 语句,而不是仅调用 python 中的 cmake --version
。
有人知道怎么做吗? 另外,如果这是 XY 问题,请告诉我。我不知道我在做什么!
使用Subprocess
subprocess = subprocess.Popen("cmake --version", shell=True, stdout=subprocess.PIPE)
subprocess_return = subprocess.stdout.read()
print(subprocess_return)
您现在在 subprocess_return
变量中有了命令的输出,
现在您可以解析它以获取版本号。
import subprocess
import re
try:
msg = subprocess.Popen("cmake --version", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read().decode()
# guess
versions = msg.split()[2]
pat = re.compile(r'[0-9]\.[0-9].+\.[0-9]')
if pat.match(versions):
print(versions.split("."))
else:
print("Invalid!")
except:
print("Invalid!")
您可以像这样检查 CMake 版本与 3.22.1 的对比:
import subprocess
from packaging import version
def get_cmake_version():
output = subprocess.check_output(['cmake', '--version']).decode('utf-8')
line = output.splitlines()[0]
version = line.split()[2]
return(version)
if version.parse(get_cmake_version()) < version.parse("3.22.1"):
exit(1)
get_cmake_version()
运行 cmake --version
,使用 check_output()
获取其输出。然后结合 split()
和 splitlines()
,它会得到第一行的第三个单词和 returns。然后我们从打包模块中用version.parse
解析get_cmake_version()
返回的版本号,并与3.22.1.
请注意,如果未安装 CMake,上述 subprocess.check_output()
调用会抛出 FileNotFoundError。但这没有记录在案。 check_output()
的文档说它可以抛出 CalledProcessError 但没有提到 FileNotFoundError.
您可能希望使用 try/except 来处理这两个错误。