16

我使用 CMake 来构建我的应用程序。如何找到 python site-packages 目录的位置?我需要路径才能编译 python 的扩展。

当我计划在 Linux、Mac 和 Windows 上部署我的应用程序时,CMake 必须能够在所有三个主要操作系统上找到路径。

我尝试使用

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 命令来删除尾随的新行。

4

4 回答 4

8

您可以使用execute_process在 cmake 中执行外部进程(并在需要时将输出放入变量中,就像这里一样)。

于 2009-08-07T05:06:40.543 回答
8

我用于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。)

于 2016-10-12T18:52:08.857 回答
6

从 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)
于 2018-09-18T11:58:03.110 回答
1

get_python_lib(True)如果您将此扩展作为动态库,我建议使用。如果您需要特定于平台的位置(在 64 位 linux 机器中,这可能是,/usr/lib64而不是/usr/lib) ,则第一个参数应该是 true

于 2010-03-29T15:34:01.620 回答