使用CMake查找Python site-packages目录
我用CMake来构建我的应用程序。请问怎么找到python的site-packages目录在哪里?我需要这个路径来编译一个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中调用这个命令呢?
解决方案:
谢谢,Alex。给我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 个回答
8
从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)
11
这是我为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
。)
9
你可以在cmake中使用 execute_process 来执行外部程序,如果需要的话,还可以把输出结果存到一个变量里,就像这里所示的那样。