使用CMake查找python site-packages目录

dzh*_*lil 15 python cmake

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

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

我试过用

include(FindPythonLibs)
find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. )
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我也可以通过运行获取路径

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
Run Code Online (Sandbox Code Playgroud)

在shell上,但我如何从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)
Run Code Online (Sandbox Code Playgroud)

需要OUTPUT_STRIP_TRAILING_WHITESPACE命令来删除尾随的新行.

Ale*_*lli 7

您可以使用execute_process在cmake中执行外部进程(如果需要,可以将输出转换为变量,就像在这里一样).

  • 这看起来像一个黑客.这仍然是(六年后)的方式吗? (3认同)
  • @TorstenBronger 为什么这是一个黑客?CMake 需要从某个地方获取信息,所以为什么不直接询问谁最了解 Python? (2认同)

Erb*_*ica 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)
Run Code Online (Sandbox Code Playgroud)

  • 问题是,似乎 `Python_SITEARCH` / `Python_SITELIB` / 等都是绝对路径,这(如上面 @Matthew 指出的那样)使得它们无法用于 `install()`,因为它将破坏 `CMAKE_INSTALL_PATH` 处理。 (2认同)

Mat*_*hew 5

我用于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)
Run Code Online (Sandbox Code Playgroud)

这设置PYTHON_SITE为适当的前缀相对路径,适用于以下用途:

install(
  FILES ${mypackage_python_files}
  DESTINATION ${PYTHON_SITE}/mypackage)
Run Code Online (Sandbox Code Playgroud)

(请不要安装在绝对路径上!这样做会绕过CMAKE_INSTALL_PREFIX。)

  • “如果为真:”有什么意义?只是为了让你缩进剩下的两行? (2认同)