Files
jlengrand.github.io/_posts/2018-06-01-installing-gdal-python36.markdown
Julien Lengrand-Lambert e2e2a102a4 Add breathing space
2018-06-01 12:43:59 +02:00

218 lines
7.9 KiB
Markdown

---
layout: post
status: publish
published: true
title: Installing gdal for Python 3.6
author: Julien Lengrand-Lambert
author_login: jlengrand
author_email: julien@lengrand.fr
author_url: http://www.lengrand.fr
categories:
- work
- fun
- development
tags:
- bash
- experiment
- python
- work
- startup
- hack
- gdal
- gis
- osgeo
comments: []
---
Heyo,
At **[Skyai](http://skyai.io/)**, we are working a lot with [Geographic Information Systems](https://en.wikipedia.org/wiki/Geographic_information_system).
Just like the large majority of the market, we use [GDAL](http://www.gdal.org/) and its Python bindings for that.
<br/><br/>
Even though we are ESRI partners, we still love our QGis and Python.
<br/><br/>
I recently changed laptop and got the latest Macbook, and had to reinstall the environement from scratch. And as much as I love Python, having to setup GDAL on my former laptop still give me nightmare so I was dreading this moment.
<br/><br/>
But actually, I have to admit that the process was much smoother than expected! I initially followed [this guide](https://hackernoon.com/install-python-gdal-using-conda-on-mac-8f320ca36d90) for Python 2.7, without success.
<br/><br/>
Without further due, here are the steps.
## Installing GDAL on Python 3.6
### My setup
* Latest MacBook Pro
* Python 3.6 (but should work for others too)
* conda 4.5.4
### Installing Conda
Simply follow [the official guide](https://conda.io/docs/user-guide/getting-started.html).
### Creating an environment with GDAL as a dependency
```
$ conda create --name gdal_test_working -c conda-forge python=3.6 gdal
```
Accept the request in your terminal :
```
Solving environment: done
## Package Plan ##
environment location: /Users/jlengrand/miniconda3/envs/gdal_test_working
added / updated specs:
- gdal
- python=3.6
The following packages will be downloaded:
package | build
---------------------------|-----------------
poppler-data-0.4.9 | 0 3.5 MB conda-forge
certifi-2018.4.16 | py36_0 142 KB conda-forge
libgdal-2.2.4 | 3 14.4 MB conda-forge
setuptools-39.2.0 | py36_0 550 KB conda-forge
------------------------------------------------------------
Total: 18.7 MB
The following NEW packages will be INSTALLED:
boost: 1.66.0-py36_1 conda-forge
boost-cpp: 1.66.0-1 conda-forge
bzip2: 1.0.6-1 conda-forge
ca-certificates: 2018.4.16-0 conda-forge
cairo: 1.14.10-0 conda-forge
certifi: 2018.4.16-py36_0 conda-forge
curl: 7.60.0-0 conda-forge
expat: 2.2.5-0 conda-forge
fontconfig: 2.12.6-0 conda-forge
freetype: 2.8.1-0 conda-forge
freexl: 1.0.5-0 conda-forge
gdal: 2.2.4-py36_0 conda-forge
geos: 3.6.2-1 conda-forge
geotiff: 1.4.2-1 conda-forge
gettext: 0.19.8.1-0 conda-forge
giflib: 5.1.4-0 conda-forge
glib: 2.55.0-0 conda-forge
hdf4: 4.2.13-0 conda-forge
hdf5: 1.10.1-2 conda-forge
icu: 58.2-0 conda-forge
jpeg: 9b-2 conda-forge
json-c: 0.12.1-0 conda-forge
kealib: 1.4.7-4 conda-forge
krb5: 1.14.6-0 conda-forge
libdap4: 3.18.3-2 conda-forge
libffi: 3.2.1-3 conda-forge
libgdal: 2.2.4-3 conda-forge
libgfortran: 3.0.1-h93005f0_2
libiconv: 1.15-0 conda-forge
libkml: 1.3.0-6 conda-forge
libnetcdf: 4.6.1-2 conda-forge
libopenblas: 0.2.20-hdc02c5d_4
libpng: 1.6.34-0 conda-forge
libpq: 9.6.3-0 conda-forge
libspatialite: 4.3.0a-19 conda-forge
libssh2: 1.8.0-2 conda-forge
libtiff: 4.0.9-0 conda-forge
libxml2: 2.9.8-0 conda-forge
ncurses: 5.9-10 conda-forge
numpy: 1.14.3-py36he6379a5_1
numpy-base: 1.14.3-py36h7ef55bc_1
openjpeg: 2.3.0-2 conda-forge
openssl: 1.0.2o-0 conda-forge
pcre: 8.41-1 conda-forge
pip: 9.0.3-py36_0 conda-forge
pixman: 0.34.0-2 conda-forge
poppler: 0.61.1-3 conda-forge
poppler-data: 0.4.9-0 conda-forge
proj4: 4.9.3-5 conda-forge
python: 3.6.5-1 conda-forge
readline: 7.0-0 conda-forge
setuptools: 39.2.0-py36_0 conda-forge
sqlite: 3.20.1-2 conda-forge
tk: 8.6.7-0 conda-forge
wheel: 0.31.0-py36_0 conda-forge
xerces-c: 3.2.0-0 conda-forge
xz: 5.2.3-0 conda-forge
zlib: 1.2.11-h470a237_3 conda-forge
Proceed ([y]/n)? y
```
### Testing the installation
Activate your newly created environment, start python and try to import GDAL
```
$ conda activate gdal_test_working
(gdal_test_working) $ python
Python 3.6.5 | packaged by conda-forge | (default, Apr 6 2018, 13:44:09)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import gdal
>>> help(gdal)
```
Enjoy!
### The secret
The magic secret is to make sure to use a single forge to install all your dependencies with conda.
In my case I used `-c conda-forge`.
This will ensure there are no possible conflicts between version.
## More about the issue
The first thing I tried was to install without the forge option like this :
```
$ conda create --name gdal_test python=3.6 gdal
```
But when trying to import gdal, here is the issue I was getting:
```
$ conda activate gdal_test
(gdal_test) $ python
Python 3.6.5 | packaged by conda-forge | (default, Apr 6 2018, 13:44:09)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import gdal
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/site-packages/gdal.py", line 2, in <module>
from osgeo.gdal import deprecation_warn
File "/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/site-packages/osgeo/__init__.py", line 21, in <module>
_gdal = swig_import_helper()
File "/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/site-packages/osgeo/__init__.py", line 17, in swig_import_helper
_mod = imp.load_module('_gdal', fp, pathname, description)
File "/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/imp.py", line 243, in load_module
return load_dynamic(name, filename, file)
File "/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/imp.py", line 343, in load_dynamic
return _load(spec)
ImportError: dlopen(/Users/jlengrand/miniconda3/envs/gdal_test/lib/python3.6/site-packages/osgeo/_gdal.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libpoppler.71.dylib
Referenced from: /Users/jlengrand/miniconda3/envs/gdal_test/lib/libgdal.20.dylib
Reason: image not found
>>>
```
In the end the trick is pretty simple, but it took me a while to find out.
Hope it helps you too!
<br/><br/>
Now, back to coding
Cheers,
Julien