使用CMake查找Python site-packages目录

20 投票
4 回答
12735 浏览
提问于 2025-04-15 13:26

我用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_SITELIBPython_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 来执行外部程序,如果需要的话,还可以把输出结果存到一个变量里,就像这里所示的那样。

撰写回答