CMake FindPython3 не может найти интерпретатор в Windows - PullRequest
1 голос
/ 06 марта 2019

Вот начало файла 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()

При сборке с cmake-3.12.4-Linux-x86_64 (скачано из cmake.org) в Linux, он отлично работает, находя обаИнтерпретатор Python3 и заголовочные файлы / библиотеки разработки, установленные через apt-get.(Python2 также установлен в системе, но я подтвердил, что он находит интерпретатор Python 3.)

В Windows 10, однако, он находит заголовки / библиотеки разработки, но не интерпретатор,печать:

-- 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

Я получаю одинаковые результаты как в MinGW Bash, так и в командной строке разработчика для VS 2017, со всеми следующими версиями CMake:

  • cmake version 3.12.18081601-MSVC_2, которыепоставляется с Visual Studio 2017.
  • cmake-3.13.4-win64-x64 загружено с cmake.org.
  • cmake-3.14.0-rc3-win64-x64 загружено с cmake.org.
  • cmake-3.14.20190305-gc9ce4f-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:\>

Я также проверил это на компьютере такого же разработчика, который установил Python 3.5 через Anaconda какего основной Python, а также 3,6 установки от python.org, и получил те же результаты.

Устаревший 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

IЯ не слишком знаком с Windows, поэтому я не уверен, куда идти, чтобы отладить это.Кто-нибудь знает, почему FindPython3 не может найти интерпретатор или как мне начать отлаживать это (кроме чтения исходного кода для FindPython3)?

1 Ответ

0 голосов
/ 08 марта 2019

Проблема здесь, согласно [CMake выпуск 19024 (https://gitlab.kitware.com/cmake/cmake/issues/19024),), заключается в том, что я делал 32-битную сборку (по умолчанию, так как я не настроил -A x64) в системе с только Установлен 64-битный Python. FindPython3 почувствовал, что нашел 32-битные инструменты разработки (хотя и не нашел), понял, что не может найти 32-битный интерпретатор, и поэтому установил Python3_FOUND=False.

Выполнение 64-разрядной сборки путем настройки -A x64 устранило эту проблему.

Проблема "поиск 32-битных инструментов разработчика, которых там нет" (из-за чего она печатала Python3_Development_FOUND=TRUE в приведенном выше вопросе) была ошибкой в ​​модуле FindPython3, которая была исправлена ​​ MR 3103 , доступно в ночной сборке 20190316. К сожалению, это не вошло в релиз 3.14.0.

Для справки, что вы хотите сделать, чтобы построить расширение после FindPython3, как оно работало успешно:

Python3_add_library(myext MODULE myextsrc)
target_link_libraries(myext other_target_on_which_it_depends)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...