web-dev-qa-db-fra.com

Cmake n'est pas capable de trouver les librairies Python

Obtenir cette erreur:

Sudo: unable to resolve Host coderw@ll
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) 
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108     
(message):
Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315  
(_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-2.8/Modules/FindPythonInterp.cmake:139 
(FIND_PACKAGE_HANDLE_STANDARD_ARGS)
Code/cmake/Modules/FindNumPy.cmake:10 (find_package)
CMakeLists.txt:114 (find_package)



-- Configuring incomplete, errors occurred!
See also "/home/coderwall/Desktop/rdkit/build/CMakeFiles/CMakeOutput.log".
See also "/home/coderwall/Desktop/rdkit/build/CMakeFiles/CMakeError.log".

J'ai déjà installé:

  1. Sudo apt-get installez python-dev
  2. Les variables d'environnement sont déjà définies comme suit:

    PYTHON_INCLUDE_DIRS=/usr/include/python2.7 
    PYTHON_LIBRARIES=/usr/lib/python2.7/config/libpython2.7.so
    

Emplacement de python.h: /usr/lib/include/python2.7/python.h

Emplacement de python libs: /usr/lib/python2.7/Comment résoudre ce problème? 

29
Amit Pal

Vous pouvez corriger les erreurs en ajoutant à la commande cmake les indicateurs -DPYTHON_LIBRARY et -DPYTHON_INCLUDE_DIR remplis avec les dossiers respectifs.

Ainsi, l’astuce consiste à renseigner ces paramètres avec les informations renvoyées par l’interpréteur python, qui sont les plus fiables. Cela peut fonctionner indépendamment de votre emplacement/version de Python (également pour les utilisateurs d'Anaconda):

$ cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")  \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")

Si la version de python que vous souhaitez lier à cmake est Python3.X et que le lien symbolique python par défaut pointe vers Python2.X, vous pouvez utiliser python3 -c ... au lieu de python -c ....

Si l'erreur persiste, vous devrez peut-être mettre à jour cmake vers une version supérieure, comme indiqué par @pdpcosta, et répéter le processus à nouveau.

23

J'ai rencontré le même problème et découvert que le message d'erreur donnait des noms de variables trompeurs. Essayez de définir les éléments suivants (singulier au lieu de pluriel):

PYTHON_INCLUDE_DIR=/usr/include/python2.7 
PYTHON_LIBRARY=/usr/lib/python2.7/config/libpython2.7.so

Les variables (au pluriel) que vous voyez sur les messages d'erreur sont des valeurs que PythonLibs définit lorsqu'il est correctement initialisé.

15
Chris Lyon

Je faisais face à ce problème en essayant de compiler OpenCV 3 sur un système Xubuntu 14.04 Thrusty Tahr . Avec tous les packages de développement de Python installés, le processus de configuration renvoyait toujours le message suivant:

Could NOT found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
Could NOT find PythonLibs (missing: PYTHON_INCLUDE_DIRS) (found suitable exact version "2.7.6")
Found PythonInterp: /usr/bin/python3.4 (found suitable version "3.4", minimum required is "3.4")
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES) (Required is exact version "3.4.0")

La version de CMake disponible sur les référentiels Thrusty Tahr est la version 2.8 . Certains articles m'ont inspiré la mise à niveau de CMake . J'ai ajouté un référentiel PPA CMake qui installe CMake version 3.2.

Après la mise à niveau, tout s'est bien déroulé et la compilation a réussi.

14
pdpcosta

Pour moi était utile ensuite:

> apt-get install python-dev python3-dev
8
Oleksandr Mosur

Ce problème peut également se produire sous Windows. Cmake examine le registre et parfois les valeurs python ne sont pas définies. Pour ceux qui ont un problème similaire:

http://ericsilva.org/2012/10/11/restoring-your-python-registry-in-windows/

Créez simplement un fichier .reg pour définir les clés nécessaires et modifiez-le en fonction de votre configuration.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Python]

[HKEY_CURRENT_USER\Software\Python\Pythoncore]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6\InstallPath]
@="C:\\python26"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6\PythonPath]
@="C:\\python26;C:\\python26\\Lib\\;C:\\python26\\DLLs\\"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7\InstallPath]
@="C:\\python27"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7\PythonPath]
@="C:\\python27;C:\\python27\\Lib\\;C:\\python27\\DLLs\\"
7
xenon

Une dernière version d'Ubuntu installe Python 3.4 par défaut et la version CMake d'Ubuntu (2.8) ne recherche que jusqu'à Python 3.3.

Essayez d'ajouter set(Python_ADDITIONAL_VERSIONS 3.4) avant l'instruction find_package.

N'oubliez pas de nettoyer CMakeCache.txt aussi.

7
Patrizio Bertoni

Même après avoir ajouté -DPYTHON_INCLUDE_DIR et -DPYTHON_LIBRARY comme suggéré ci-dessus, je faisais toujours face à l'erreur Could NOT find PythonInterp. Ce qui a résolu le problème, c’était d’ajouter -DPYTHON_EXECUTABLE:FILEPATH= à cmake comme suggéré dans https://github.com/pybind/pybind11/issues/99#issuecomment-182071479 :

cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")  \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \
-DPYTHON_EXECUTABLE:FILEPATH=`which python`
2
Lane Rettig

Collez ceci dans votre CMakeLists.txt:

# find python
execute_process(COMMAND python-config --prefix OUTPUT_VARIABLE PYTHON_SEARCH_PATH)
string(REGEX REPLACE "\n$" "" PYTHON_SEARCH_PATH "${PYTHON_SEARCH_PATH}")
file(GLOB_RECURSE PYTHON_DY_LIBS ${PYTHON_SEARCH_PATH}/lib/libpython*.dylib ${PYTHON_SEARCH_PATH}/lib/libpython*.so)
if (PYTHON_DY_LIBS)
    list(GET PYTHON_DY_LIBS 0 PYTHON_LIBRARY)
    message("-- Find shared libpython: ${PYTHON_LIBRARY}")
else()
    message(WARNING "Cannot find shared libpython, try find_package")
endif()

find_package(PythonInterp)
find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT)
0
BruceGuo