python - CMake FindPython3 无法在 Windows 上找到解释器

标签 python windows cmake visual-studio-2017

这是我正在使用的 CMakeLists.txt 文件的开头:

cmake_minimum_required(VERSION 3.12)
project(hello-pyext)

find_package(Python3 COMPONENTS Interpreter Development)
message(STATUS
    "Python: version=${Python3_VERSION} interpreter=${Python3_EXECUTABLE}")
if(NOT Python3_FOUND AND Python3_Development_FOUND)
    #   find_package() will not abort the build if anything's missing.
    string(JOIN "\n" errmsg
        "  Python3 and/or development libs not found."
        "  - Python3_FOUND=${Python3_FOUND}"
        "  - Python3_Development_FOUND=${Python3_Development_FOUND}"
        )
    message(FATAL_ERROR ${errmsg})
endif()

当在 Linux 上使用 cmake-3.12.4-Linux-x86_64(从 cmake.org 下载)构建时,它工作正常,找到了 Python3 解释器和开发通过 apt-get 安装的 header /库。 (系统上也安装了Python2,但我已经确认它找到的解释器是Python 3 的。)

但是,在 Windows 10 上,它找到开发 header /库,但找不到解释器,打印:

-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.14393.
-- Could NOT find Python3 (missing: Python3_EXECUTABLE Interpreter) (found version "3.6.6")
-- Python: version=3.6.6 interpreter=Python3_EXECUTABLE-NOTFOUND
CMake Error at hello-pyext/CMakeLists.txt:14 (message):
    Python3 and/or development libs not found.
    - Python3_FOUND=FALSE
    - Python3_Development_FOUND=TRUE

使用以下所有版本的 CMake,我在 MinGW Bash 和 VS 2017 的开发人员命令提示符中得到相同的结果:

  • cmake 版本 3.12.18081601-MSVC_2 随 Visual Studio 2017 一起提供。
  • cmake-3.13.4-win64-x64cmake.org 下载。
  • cmake-3.14.0-rc3-win64-x64cmake.org 下载。
  • cmake-3.14.20190305-gc9c​​e4f-win64-x64(截至本次编辑的最新开发版本)从 cmake.org 下载

据我所知,我只使用过 python.org 中的标准安装程序来安装 Python。 “程序和功能”列出了已安装的 Python 3.4.4(64 位)、Python 3.6.6(64 位)和 Python Launcher。 py 启动器正确启动了这两个文件,以及 python 本身位于我的路径中:

C:\>py --version
Python 3.6.6
C:\>py -3.4 --version
Python 3.4.4
C:\>python --version
Python 3.6.6
C:\>python3 --version
'python3' is not recognized as an internal or external command,
operable program or batch file.
C:\>

我还针对一位开发人员的机器进行了检查,该开发人员通过 Anaconda 安装了 Python 3.5 作为他的主要 Python,并从 python.org 安装了 3.6,并得到了相同的结果。

已弃用的 FindPythonInterp 似乎确实有效:

find_package(PythonInterp)
message("
    PYTHONINTERP_FOUND=${PYTHONINTERP_FOUND}
    PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
    PYTHON_VERSION_STRING=${PYTHON_VERSION_STRING}
")
-- Found PythonInterp: C:/Program Files/Python36/python.exe (found version "3.6.6")

    PYTHONINTERP_FOUND=TRUE
    PYTHON_EXECUTABLE=C:/Program Files/Python36/python.exe
    PYTHON_VERSION_STRING=3.6.6

我对 Windows 不太熟悉,所以我不知道从这里到哪里去调试它。有谁知道为什么 FindPython3 无法找到解释器,或者我应该如何开始调试它(不仅仅是阅读 FindPython3 的源代码)?

最佳答案

这里的问题,根据 [CMake 问题 19024( https://gitlab.kitware.com/cmake/cmake/issues/19024 ),是我正在执行 32 位构建(默认值,因为我没有配置 -A x64 )在仅安装 64 位 Python 的系统上。 FindPython3 感觉它已经找到了 32 位开发工具(尽管它没有),意识到它找不到 32 位解释器,因此设置 Python3_FOUND=False

通过配置 -A x64 进行 64 位构建解决了该问题。

“查找不存在的 32 位开发工具”问题(导致上面问题中打印 Python3_Development_FOUND=TRUE)是 FindPython3 中的错误> 已由 MR 3103 修复的模块,在 20190316 nightly build 中提供。不幸的是,这没有进入 3.14.0 版本。

作为引用,在 FindPython3 成功运行后,您想要构建扩展的操作是:

Python3_add_library(myext MODULE myextsrc)
target_link_libraries(myext other_target_on_which_it_depends)

关于python - CMake FindPython3 无法在 Windows 上找到解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55021986/

相关文章:

Windows 上的 Python C 扩展。错误 : not found vcvarsall. bat

c++ - 如何在 EXECUTE_PROCESS 中使用 FILE(GLOB_RECURSE) 的结果?

python - python/django 中的重音字符被替换为\xed

python - 获取一列的值,其中一列为最大值,另一列为最小值

windows - 将子文件夹的内容复制到另一个文件夹

c# - 在字符串 C# 中提取日期?

c++ - 使用 libfreenect2 构建

cmake - 如何清除/删除缓存变量

python - 如何快速获取使用 PyCharm 和 Pytorch 的文档

python - 未找到 kaggleword2vec 实用程序