模块名为“_gdal”不存在。

15

我正在尝试运行Python脚本test.py来测试gdal库。该脚本包含以下代码:

from osgeo import gdal

那一行代码出现了回溯(traceback):

File "~/test.py", line 9, in <module>
    from osgeo import gdal
File "/usr/local/lib/python2.7/site-packages/GDAL-2.2.0/osgeo/__init__.py", line 21, in <module>
    gdal = swing_import_helper()
File "/usr/local/lib/python2.7/site-packages/GDAL-2.2.0/osgeo/__init__.py", line 13, in swig_import_helper
    import gdal
ImportError: No module named _gdal

我没有看到任何_gdal的Python文件或任何定义_gdal的脚本。我需要安装另一个(先决条件)库来定义_gdal吗?GDAL包应该包括安装库和运行导入gdal的脚本所需的一切。


2
你有没有找到解决办法? - GaussTheBauss
4
你介意分享一下吗?我也遇到了同样的问题。 - GaussTheBauss
3
好的,还在等待中.... :P - Elgert
8
这让我想起了这个网页:https://xkcd.com/979/。 - Benedikt Köppel
1
@GaussTheBauss,你们有没有找到解决方案?一年后我也遇到了同样的问题... - lve
显示剩余2条评论
9个回答

6

致谢: https://udayrage.github.io/geoAnalytics.html

由于GDAL安装过程非常特定,因此经常会出现问题。按照以下步骤正确安装GDAL。

创建新的conda环境,然后运行以下命令。

sudo apt-get update && sudo apt upgrade -y && sudo apt autoremove 
sudo apt-get install -y cdo nco gdal-bin libgdal-dev


python -m pip install --upgrade pip setuptools wheel
python -m pip install --upgrade gdal


conda install -c conda-forge libgdal
conda install -c conda-forge gdal
conda install tiledb=2.2
conda install poppler

如果安装正确,该行应输出GDAL版本。
ogrinfo --version

问题已经解决了,谢谢! - David

3
在我的情况下,从你的Python lib目录中的site-packagesdist-packages找到osgeo目录,然后将_gdal.cpython-35m-x86_64-linux-gnu.so重命名为_gdal.so,其他文件也是这样。然后你就可以正确导入gdal了。

在我的情况下,文件夹中没有.so文件。 - Max J

1

因为有些人仍然在遇到这个问题(我也是其中之一),所以我想要解释一下:

ImportError: No module named _gdal 是指文件 _gdal.so。它是一个动态库,应该在使用python3编译gdal源代码时自动生成:

./configure --with-python=python3 && make

但是,即使configure告诉我SWIG python bindings将会被使用,make命令仍不会构建它们。我认为python绑定通常都是GDAL的问题。

现在,如果你不想要安装GDAL (make install),你将需要手动构建绑定: 进入/gdal/swig/python并运行python setup.py build。之后,所有模块和库都将被创建:确保路径可以找到,一切都应该正常工作,包括像OP所想要的运行测试。

如果您想安装GDAL,那么Benedikt所写的就足以让一切正常运行。

1

我曾经遇到过同样的问题,通过查找我的 osgeo(gdal) 安装库路径并将其添加到 PYTHONPATH 中解决了它。

  • 使用此命令 find / -name "_gdal*" 查找您的 osgeo 库安装路径
  • 之后,您需要将找到的路径添加到 PYTHONPATH 中
export PYTHONPATH=/path/to/lib/python2.7/site-packages/:$PYTHONPATH
# you can also add it permanently to your ~/.bashrc

1
就像这样简单:
ldconfig

或者如果你需要在Python会话中快速解决问题

os.system('ldconfig')

ldconfig可以自动修复由于版本更新而导致的损坏符号链接。


1

如果您想在Windows上使用from osgeo import gdal或安装gdal,请按照以下方法操作:

  • 首先,您需要查看主机上安装的GDAL版本。您可以使用pip list命令查看。我的版本是GDAL==3.2.3
  • 现在检查您的Python版本。使用python --version命令即可。我的版本是3.7
  • 检查您的系统是32位还是64位。

完成以上步骤后,您可以访问以下链接并下载所需的wheel文件:

Geospatial Data Abstraction Library是一个用于光栅地理空间数据格式的转换器库

我下载了GDAL‑3.2.3‑cp37‑cp37m‑win_amd64.whl文件。

现在运行pip install GDAL‑3.2.3‑cp37‑cp37m‑win_amd64.whl命令即可完成安装。

谢谢!


使用pip install force-reinstall GDAL-...,whl修复了错误。谢谢。 - Jillinger

1
在我的情况下,我已经从源代码构建了GDAL(使用./configure --with-python && make),然后尝试直接从./swig/python/build/lib.linux-x86_64-2.7/源文件夹运行Python工具。这导致了相同的错误:
[beni@vendace gdal-2.4.0]$ PYTHONPATH=./swig/python/build/lib.linux-x86_64-2.7/:$PYTHONPATH python -c 'from osgeo import gdal'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/beni/gdal/gdal-2.4.0/swig/python/build/lib.linux-x86_64-2.7/osgeo/__init__.py", line 21, in <module>
    _gdal = swig_import_helper()
  File "/home/beni/gdal/gdal-2.4.0/swig/python/build/lib.linux-x86_64-2.7/osgeo/__init__.py", line 13, in swig_import_helper
    import _gdal
ImportError: No module named _gdal

安装GDAL(使用make install)后,将构建_gdal.so模块,现在可以导入gdal:
[beni@vendace gdal-2.4.0]$ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/local/lib64/python2.7/site-packages/:$PYTHONPATH python -c 'from osgeo import gdal; print(gdal.__version__);'
2.4.0

0

我遇到了一些问题,都导致了“没有名为_gdal的模块”的错误消息。首先,我将GDAL安装到了非标准位置,并没有意识到服务器上也安装了一个古老版本的系统包。通过ldd _gdal.so,我能够发现新的绑定是针对旧的系统库构建的,这不起作用。由于我无法修改系统包,因此我从pypi.org下载了源代码,并使用环境变量确保绑定是针对我首选的GDAL版本构建的:

d="/path/to/gdal"
env CPPFLAGS=-I$d/include LDFLAGS="-L$d/lib -Wl,-rpath,$d/lib" python2 setup.py install

在完成这个步骤后,_gdal.so文件已经与正确的libgdal链接起来了,但是我仍然无法导入它。通过使用ctypes尝试加载它,我得到了一个更好的错误信息。
>>> ctypes.cdll.LoadLibrary("_gdal.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/ctypes/__init__.py", line 438, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib64/python2.7/ctypes/__init__.py", line 360, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /u/pmr0/uavops/Software/spack-0.16.2/var/spack/environments/uavops/.spack-env/view/lib/libgdal.so.28)

我通过使用与编译libgdal相同的C++编译器编译绑定程序来解决了这个问题。


0

除了其他答案之外,如果您从源代码构建和安装,然后尝试从包含osgeo python绑定的同一文件夹运行测试命令,也会发生这种情况,即swig/python/

默认情况下,从该位置运行python -c 'from osgeo import gdal; print(gdal.__version__)'将失败。

由于我只想在安装的站点软件包文件夹中搜索新模块,因此解决方案是以隔离模式运行python,以便不再包括当前目录:

python -I -c 'from osgeo import gdal; print(gdal.__version__)'

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