cmake Python:无法使用解释器

问题描述 投票:0回答:3

我正在使用 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)

python cmake
3个回答
0
投票

虽然我仍然不知道为什么

find_package
发出了这个特定的错误,但我能够通过使用自己编写的函数来定位Python解释器来规避它,并且这样做它更喜欢在PATH或其他标准中找到的可执行文件目录。

该脚本可在 https://github.com/Krzmbrzl/FindPythonInterpreter 获取(包括使用说明)。

简而言之,这让我可以使用以下代码片段来查找 Python 3 解释器:

find_python_interpreter(
    VERSION 3
    INTERPRETER_OUT_VAR PYTHON_INTERPRETER
    REQUIRED
)

0
投票

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 分钟后,在没有进行任何更改后,我尝试再次配置,一切正常。我不知道发生了什么。


0
投票

我看到你正在使用 pyenv。从 3.22 开始,cmake FindPython 模块无法与 pyenv 垫片一起使用。它需要提示才能找到正确的目录。这在 Linux 上对我有用:

cmake -B build -S . -DPython3_ROOT_DIR=`pyenv prefix`
© www.soinside.com 2019 - 2024. All rights reserved.