Поиск каталога пакетов сайта python с помощью CMake - PullRequest
14 голосов
/ 07 августа 2009

Я использую 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?

РЕШЕНИЕ:

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

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 необходима для удаления завершающей новой строки.

Ответы [ 4 ]

7 голосов
/ 07 августа 2009

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

4 голосов
/ 12 октября 2016

Немного обновленная версия, которую я использовал для 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.)

2 голосов
/ 18 сентября 2018

Начиная с 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)
1 голос
/ 29 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...