Cmake无法找到Python库。

79

出现此错误:

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".

我已经安装好了:

  1. sudo apt-get install python-dev
  2. 环境变量已经设置如下:

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

python.h 的位置: /usr/lib/include/python2.7/python.h

python 库的位置: /usr/lib/python2.7/如何解决?


1
嗯,尝试设置 PYTHON_EXECUTABLE=... - nitekrawler
尝试过了,它识别出来了,但仍然出现了以下错误:无法找到PythonLibs(缺少:PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) - Amit Pal
请问您能否在您的问题中包含rdkit根目录下的CMakeLists.txt文件的代码?这可能会有所帮助。 - Bertrand Moreau
14个回答

78

你可以通过在cmake命令中添加-DPYTHON_LIBRARY-DPYTHON_INCLUDE_DIR标志并填写相应文件夹来修复错误。

因此,诀窍在于使用从python解释器返回的信息来填充这些参数,这是最可靠的。这可能与您的python位置/版本无关(也适用于Anaconda用户)。

$ cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "import sysconfig; print(sysconfig.get_path('include'))")  \
-DPYTHON_LIBRARY=$(python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))")

如果您想将cmake链接到Python3.X版本,而默认的Python符号链接指向Python2.X,则可以使用python3 -c ...代替python -c ...

如果错误仍然存在,您可能需要按照@pdpcosta所述更新cmake到更高版本,然后再次重复该过程。


打印(sysconfig.get_config_var('LIBDIR'))"输出/opt/conda/lib,但是我得到了以下警告:警告:目标“something-something”请求链接到目录“/opt/conda/lib”。目标只能链接到库。CMake正在删除该项。
  • 我们需要给-DPYTHON_LIBRARY路径到.so libpython吗?
- Mr.WorshipMe
5
是的,我更改了命令以给出路径到 .so 文件,像这样:-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; import os; print(os.path.join(sysconfig.get_config_var('LIBDIR'), sysconfig.get_config_var('LDLIBRARY')))") - kgully
对于Anaconda,这个方法对我很有效(并且希望更容易地推广):https://github.com/jkhoogland/FindPythonAnaconda(尽管我不得不做两个小改变——如果上游也不适用于您,它们都在我的GitHub分支中)。 - Braham Snyder
这是最佳答案,因为它会自动调整到当前的Python环境(which python),并且在conda环境处于活动状态时可以无缝运行。 - Brent Faust
注意(希望能够帮助使用Cmake和Python 3的M1 Mac用户):在我的情况下,为了使我的特定问题得以解决,我需要执行“DPYTHON3_LIBRARY”和“DPYTHON3_INCLUDE_DIR”。如果没有加上3,它是无法正常工作的。 - Melvin Roest
对于任何看到"distutils.sysconfig"弃用警告的人,您可以使用sysconfig并调用sysconfig.get_path('include')获取-DPYTHON_INCLUDE_DIR和sysconfig.get_config_var('LIBDIR') - Joseph Bradshaw

46

对我来说这很有帮助:

# if using python2
apt-get install python-dev

# if using python3
apt-get install python3-dev

2
对于我(在Centos7上),这行解决了问题:yum install python34-devel - Agnis
这对我起作用了,没有其他答案建议的任何cmake参数(例如-DPYTHON_LIBRARY等)。我有python-dev,但忘记了python3-dev - tsbertalan
2
非常糟糕的答案。就像是,如果不起作用,尝试安装所有东西。你需要的要么是python2或者python3...(现在2023年了,最好更新你的答案,因为python2已经被弃用) - jaques-sam
1
这应该被标记为正确答案。 - KLiFF
这对我解决了问题。 - Yishai E

21

我遇到了同样的问题,并发现错误信息提供了误导性的变量名。尝试设置以下内容(使用单数而非复数):

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

当你看到错误消息中提到的变量(复数)时,它们是PythonLibs在正确初始化时设置的值。


这个问题真的需要在OpenCV安装文档中提到。此外,在从源代码构建时,他们可以更详细地解释可用的CMake选项,以便提供更多帮助。http://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html - user2918461

19

尽管按照上面的建议添加了-DPYTHON_INCLUDE_DIR-DPYTHON_LIBRARY,我仍然遇到了错误Could NOT find PythonInterp。解决方法是像在https://github.com/pybind/pybind11/issues/99#issuecomment-182071479中建议的那样,在cmake中添加-DPYTHON_EXECUTABLE:FILEPATH=

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`

谢谢!我也找到了那个Github页面,但是我只设置了PYTHON_EXECUTABLE:FILEPATH,但没有起作用。你的解决方案解决了我在MacOSX(Mojave)上构建OpenVDB时遇到的问题。 - nantille
非常感谢,我找不到libpython-x.so文件,也无法手动编译和安装opencv-python,但这种方式解决了我的问题。 - Sailist

15

在尝试编译OpenCV 3时,我遇到了这个问题,我的系统是Xubuntu 14.04 Thrusty Tahr。即使安装了Python的所有开发包,配置过程仍然会返回以下消息:

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")

在Trusty Tahr仓库中可用的CMake版本为2.8。 一些文章激励我升级CMake。 我添加了一个PPA CMake仓库,它安装CMake版本3.2。

升级后一切都很顺利,编译成功。


不要忘记首先清除所有的cmake缓存! - acgtyrant
@acgtyrant 你是怎么做到的?cmake clean? - KansaiRobot

10

某些最新版本的Ubuntu默认安装Python 3.4,而Ubuntu自带的CMake版本(2.8)只搜索Python 3.3。

尝试在find_package语句之前添加set(Python_ADDITIONAL_VERSIONS 3.4)

记得也要清空CMakeCache.txt


这是我在我的14.04 Ubuntu系统上遇到的问题。我通过安装更新的cmake版本(https://askubuntu.com/a/945589/187411)来解决它。 - UTF_or_Death
1
我通过在mbec-cli2 CMake中清除CMakeCache.txt文件解决了问题(未找到jinja2,intelhex和prettytable)。非常感谢Patrizio。 - kuri65536

7

这个问题也可能发生在Windows系统中。Cmake会查找注册表,有时Python的值没有被设置。如果遇到类似的问题:

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

只需创建一个.reg文件来设置必要的键,并根据您的设置进行编辑。

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\\"

如果我同时安装了32位和64位版本,并且想要构建32位和64位的C++二进制文件,这个方法也适用吗? - Damian

2

我在我的系统上升级到了Python3.8,但是安装不完整。通过安装剩余的3.8包,成功解决了这个问题:

sudo apt-get install python3.8 python3.8-dev python3.8-distutils python3.8-venv

2
请注意,如果您使用的是cMake 3.12或更高版本,则变量PythonInterpPythonLibs已更改为Python。因此,我们使用以下代码: find_package(Python ${PY_VERSION} REQUIRED),而不是:find_package(PythonInterp ${PY_VERSION} REQUIRED)find_package(PythonLibs ${PY_VERSION} REQUIRED)。详情请参见https://cmake.org/cmake/help/v3.12/module/FindPython.html

1
把这个粘贴到你的 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接