Pregunta

Yo uso CMake para construir mi aplicación. ¿Cómo puedo encontrar dónde se encuentra el directorio site-packages de Python? Necesito el camino con el fin de compilar una extensión de pitón.

CMake tiene que ser capaz de encontrar el camino de los tres principales sistemas operativos ya que tengo pensado para desplegar mi aplicación en Linux, Mac y Windows.

He intentado utilizar

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

Sin embargo que no funciona.

También puedo obtener la ruta mediante la ejecución

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

en la cáscara, pero ¿cómo iba a invocar que a partir de CMake?

SOLUCIÓN:

Gracias, Alex. Por lo que el comando que me da la dir paquete de sitio es:

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)

Se necesita el comando OUTPUT_STRIP_TRAILING_WHITESPACE para eliminar la nueva línea de salida.

¿Fue útil?

Solución

Puede ejecutar procesos externos en cmake con execute_process (y obtener el resultado en una variable si es necesario, ya que sería aquí).

Otros consejos

versión ligeramente actualizada que he utilizado para mcm :

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)

Esto establece PYTHON_SITE a la ruta de prefijo-relativo apropiado, adecuado para su uso como:

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

(Por favor, no instale en una ruta absoluta! Si lo hace, no pasa por CMAKE_INSTALL_PREFIX.)

Desde CMake 3.12 se puede utilizar FindPython módulo que puebla Python_SITELIB y las variables Python_SITEARCH para la arquitectura bibliotecas independientes y específicos, respectivamente.

Ejemplo:

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)

Es mejor utilizar get_python_lib(True) si va a realizar esta extensión como una biblioteca dinámica. Este primer parámetro debe ser cierto si usted necesita la ubicación específica de la plataforma (en máquinas Linux de 64 bits, esto podría ser /usr/lib64 en lugar de /usr/lib)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top