Trouver python site-packages répertoire avec CMake
Question
J'utilise CMake pour construire mon application. Comment puis-je trouver où se trouve le répertoire python site-packages? J'ai besoin du chemin afin de compiler une extension python.
CMake doit être en mesure de trouver le chemin sur les trois principaux OS comme je l'intention de déployer mon application sur Linux, Mac et Windows.
J'ai essayé d'utiliser
include(FindPythonLibs)
find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. )
mais qui ne fonctionne pas.
Je peux aussi obtenir le chemin en exécutant
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
sur la coque, mais comment pourrais-je invoquer que de CMake?
SOLUTION:
Merci, Alex. Ainsi, la commande qui me donne le paquet site dir est:
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)
La commande OUTPUT_STRIP_TRAILING_WHITESPACE est nécessaire pour éliminer la nouvelle ligne de fuite.
La solution
Vous pouvez exécuter des processus externes dans CMake avec execute_process (et obtenir la sortie dans une variable si nécessaire, car il serait ici).
Autres conseils
Version légèrement mise à jour que je 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)
Ceci définit PYTHON_SITE
sur le chemin de préfixe relatif approprié, adapté à une utilisation comme:
install(
FILES ${mypackage_python_files}
DESTINATION ${PYTHON_SITE}/mypackage)
(S'il vous plaît ne pas installer un chemin absolu! Ce faisant, court-circuite CMAKE_INSTALL_PREFIX
.)
Depuis CMake 3,12 vous pouvez utiliser le module FindPython qui Python_SITELIB
remplit et variables Python_SITEARCH
pour l'architecture des bibliothèques indépendantes et spécifiques, respectivement.
Exemple:
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)
Je suggère d'utiliser get_python_lib(True)
si vous faites cette extension comme une bibliothèque dynamique. Ce premier paramètre doit être vrai si vous avez besoin de l'emplacement de la plate-forme spécifique (dans les machines Linux 64 bits, cela pourrait être /usr/lib64
au lieu de /usr/lib
)