2009-08-07 14 views
11

Uso CMake para compilar mi aplicación. ¿Cómo puedo encontrar dónde se encuentra el directorio python site-packages? Necesito la ruta para compilar una extensión a Python.Encontrar el directorio python site-packages con CMake

CMake tiene que ser capaz de encontrar la ruta en los tres sistemas operativos principales ya que planeo 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 de

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. Así que el comando que me da la dir paquete de sitio es: se necesita

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) 

El comando OUTPUT_STRIP_TRAILING_WHITESPACE para eliminar la nueva línea de salida.

+2

Solo para referencia futura; Encontré este gran paquete: https://github.com/lyricat/Hotot/tree/master/cmake/modules – dashesy

Respuesta

6

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

+2

Esto parece un truco. ¿Todavía es (después de seis años) el camino a seguir? –

+1

@TorstenBronger ¿Por qué es esto un truco? CMake necesita obtener la información de alguna parte, entonces ¿por qué no preguntar quién sabe mejor, es decir, Python directamente? – kynan

+0

FWIW, mi intención al usar CMake es utilizarlo para abstraer estas cosas. –

1

Sugiero usar get_python_lib(True) si está haciendo 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)

2

versión ligeramente actualizada que he usado para 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) 

Ajusta PYTHON_SITE el prefijo de ruta-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.)

+1

¿Cuál es el punto del 'si es verdadero:'? ¿Solo para permitir que sangres las 2 líneas restantes? – kynan

+1

Exactamente eso: para que la secuencia de comandos en línea no se rompa en la sangría del código CMake circundante. – Matthew

Cuestiones relacionadas