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