我使用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命令来删除尾随的新行.
您可以使用execute_process在cmake中执行外部进程(如果需要,可以将输出转换为变量,就像在这里一样).
从 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)
Run Code Online (Sandbox Code Playgroud)
我用于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。)