我第一次构建一个项目,它真的很令人困惑。我已经通过使用 gitmodules 包含了一个项目,并且正在使用 Visual Studio,并且我想在我自己的项目中静态链接该项目。问题是该项目没有附带 Visual Studio 解决方案,因此我只能在其上运行 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”
我正在尝试从调用中获取要在 python 中的 if 语句中使用的 CMake 版本,而不是仅在 python 中调用
cmake --version
。
我正在寻找一种在 python 中本地执行此操作的方法,而不是通过在 python 中调用命令行。
您可以像这样检查 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()
的组合,它会获取第一行的第三个单词并返回它。然后我们用打包模块中的get_cmake_version()
解析version.parse
返回的版本号,并与3.22.1进行比较。
请注意,当未安装 CMake 时,上述
subprocess.check_output()
调用会抛出 FileNotFoundError。但这没有记录在案。 check_output()
的文档说它可以抛出 CalledProcessError 但没有提到 FileNotFoundError。
您可能希望使用 try/ except 来处理这两个错误。
使用
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!")