我正在使用 cmake 的
find_package
来定位 Python3,如下所示:
find_package(Python3 REQUIRED COMPONENTS Interpreter)
这在我的本地系统上有效,但在我们的 CI 上,它在某些运行中失败(一次是 Linux,一次是带有 MXE 的 Linux),它会出现错误
Could NOT find Python3 (missing: Python3_EXECUTABLE Interpreter)
Reason given by package:
Interpreter: Cannot use the interpreter "/opt/pyenv/shims/python3.8"
在相同的系统上,如果我直接使用
python3
调用我的脚本,它就可以工作。因此我可以肯定地说他们确实有一个可用的 Python 环境。
我想知道
find_package
执行了什么样的检查,导致它相信口译员没有工作。最重要的是:我如何禁用这些检查?
注意:我不能简单地依赖 Python 位于 PATH 中,因为这个假设在我们的 Windows CI 上被打破,其中
find_package
方法工作得很好。
注2:我使用的是最新的cmake版本(来自Kitware的PPA)
虽然我仍然不知道为什么
find_package
发出了这个特定的错误,但我能够通过使用自己编写的函数来定位Python解释器来规避它,并且这样做它更喜欢在PATH或其他标准中找到的可执行文件目录。
该脚本可在 https://github.com/Krzmbrzl/FindPythonInterpreter 获取(包括使用说明)。
简而言之,这让我可以使用以下代码片段来查找 Python 3 解释器:
find_python_interpreter(
VERSION 3
INTERPRETER_OUT_VAR PYTHON_INTERPRETER
REQUIRED
)
find_package(Python3 REQUIRED)
对我来说工作得很好,然后在重新启动我的计算机后,由于某种未知的原因,这种情况开始发生。似乎是因为 python 解释器的路径没有用引号引起来。如果我使用 --trace-expand 运行 CMake,那么这里是正在使用的测试命令:execute_process(COMMAND C:/Program Files/WindowsApps/PythonSoftwareFoundation.Python.3.10_3.10.1008.0_x64__qbz5n2kfra8p0/python3.10.exe -c import sys; sys.stdout.write(str(sys.version_info[0])) RESULT_VARIABLE result OUTPUT_VARIABLE version ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE )
如果我在提示符下运行此命令,我会得到:
'C:/Program' is not recognized as an internal or external command, operable program or batch file.
编辑:10 分钟后,在没有进行任何更改后,我尝试再次配置,一切正常。我不知道发生了什么。
我看到你正在使用 pyenv。从 3.22 开始,cmake FindPython 模块无法与 pyenv 垫片一起使用。它需要提示才能找到正确的目录。这在 Linux 上对我有用:
cmake -B build -S . -DPython3_ROOT_DIR=`pyenv prefix`