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.

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top