Finding python site-packages directory with CMake

半腔热情 提交于 2020-01-21 01:13:12

问题


I use CMake to build my application. How can I find where the python site-packages directory is located? I need the path in order to compile an extension to python.

CMake has to be able to find the path on all three major OS as I plan to deploy my application on Linux, Mac and Windows.

I tried using

include(FindPythonLibs)
find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. )

however that does not work.

I can also obtain the path by running

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

on the shell, but how would I invoke that from CMake ?

SOLUTION:

Thanks, Alex. So the command that gives me the site-package dir is:

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)

The OUTPUT_STRIP_TRAILING_WHITESPACE command is needed to remove the trailing new line.


回答1:


You can execute external processes in cmake with execute_process (and get the output into a variable if needed, as it would be here).




回答2:


Slightly updated version that I used for 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)

This sets PYTHON_SITE to the appropriate prefix-relative path, suitable for use like:

install(
  FILES ${mypackage_python_files}
  DESTINATION ${PYTHON_SITE}/mypackage)

(Please don't install to an absolute path! Doing so bypasses CMAKE_INSTALL_PREFIX.)




回答3:


Since CMake 3.12 you can use FindPython module which populates Python_SITELIB and Python_SITEARCH variables for architecture independent and specific libraries, respectively.

Example:

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)



回答4:


I suggest to use get_python_lib(True) if you are making this extension as a dynamic library. This first parameter should be true if you need the platform specific location (in 64bit linux machines, this could be /usr/lib64 instead of /usr/lib)



来源:https://stackoverflow.com/questions/1242904/finding-python-site-packages-directory-with-cmake

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!