Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Поиск каталога сайтов-пакетов python с помощью CMake

Автор вопроса: D RОтветов: 4

Я использую CMake для создания своего приложения. Как я могу найти, где находится каталог сайтов-пакетов python? Мне нужен путь, чтобы скомпилировать расширение для python.

CMake должен быть в состоянии найти путь во всех трех основных ОС, поскольку я планирую развернуть свое приложение на Linux, Mac и Windows.

я пытался использовать

include(FindPythonLibs)
find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. )

однако это не работает.

Я также могу получить путь, запустив

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

в оболочке, но как мне вызвать это из CMake?

РЕШЕНИЕ:

Спасибо, Алекс. Итак, команда, которая дает мне каталог сайта-пакета:

execute_process ( COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)

Команда OUTPUT_STRIP_TRAILING_WHITESPACE необходима для удаления завершающей новой строки.

  • Просто для дальнейшего использования; Я нашел этот отличный пакет: github.com/lyricat/Hotot/tree/master/ cmake/модули dashesy 28.02.2013
  • Для тех, кто использует python 3.x, оператор print должен читать: print(get_python_lib()) wesanyer 19.04.2018

pythoncmake

Ответы

Ответ 1 · рейтинг 7 · Alex Martelli

Вы можете выполнять внешние процессы в cmake с помощью execute_process (и получить вывод в переменную, если это необходимо, как здесь).

Ответ 2 · рейтинг 7 · Matthew

Слегка обновленная версия, которую я использовал для lcm:

execute_process(
  COMMAND "${PYTHON_EXECUTABLE}" -c "if True:
    from distutils import sysconfig as sc
    print(sc.get_python_lib(prefix='', plat_specific=True))"
  OUTPUT_VARIABLE PYTHON_SITE
  OUTPUT_STRIP_TRAILING_WHITESPACE)

Это устанавливает PYTHON_SITE в соответствующий путь относительно префикса, подходящий для использования, например:

install(
  FILES ${mypackage_python_files}
  DESTINATION ${PYTHON_SITE}/mypackage)

(Пожалуйста, не устанавливайте абсолютный путь! Это обходит CMAKE_INSTALL_PREFIX.)

Ответ 3 · рейтинг 6 · Erbureth says Reinstate Monica

Начиная с CMake 3.12 вы можете использовать модуль FindPython, который заполняет переменные Python_SITELIB и Python_SITEARCH для архитектурно-независимые и специфичные библиотеки соответственно.

Пример:

find_package(Python ${PYTHON_VERSION} REQUIRED COMPONENTS Development)
Python_add_library(foo MODULE
    src/foo.cc src/python_interface.cc
)
install(TARGETS foo DESTINATION ${Python_SITEARCH}/foo)

Ответ 4 · рейтинг 1 · Ruben

Я предлагаю использовать get_python_lib(True), если вы делаете это расширение как динамическую библиотеку. Этот первый параметр должен быть истинным, если вам нужно местоположение для конкретной платформы (в 64-битных машинах Linux это может быть /usr/lib64 вместо /usr/lib)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы