Skip to content

Commit 0668941

Browse files
authored
Article : obtenir la version installée de PROJ en Python (#954)
J'ai aussi ajouté une réf à OSGeo/PROJ#3836
2 parents a781bb2 + 4fe6f91 commit 0668941

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
title: Obtenir la version de PROJ installée en Python
3+
subtitle: "EPSG:9.2.1"
4+
icon: material/spotlight
5+
authors:
6+
- Julien MOURA
7+
categories:
8+
- article
9+
date: 2023-07-25 10:20
10+
description: "Mémo technique : comment récupérer la version de PROJ installée depuis un script Python, avec GDAL, PyProj ou le binaire proj."
11+
image:
12+
license: beerware
13+
robots: index, follow
14+
tags:
15+
- expression régulière
16+
- PROJ
17+
- Python
18+
---
19+
20+
# Python : obtenir la version de PROJ installée
21+
22+
:calendar: Date de publication initiale : 25 juillet 2023
23+
24+
![icône projection](https://cdn.geotribu.fr/img/logos-icones/divers/projection.png){: .img-rdp-news-thumb }
25+
26+
En butant sur un souci de reconnaissance de SRS lié aux [choix éclairés de l'IGN en matière de registre spécifique](https://twitter.com/EvenRouault/status/1437818895604269059), j'ai eu besoin de vérifier la version de PROJ installée de façon à pouvoir adapter le comportement du script.
27+
Formulé comme ça, mon candide moi s'est dit :
28+
29+
> allez zou, un coup de `proj --version` ou `-V` dans un subprocess et on n'en parle plus !
30+
31+
C'est alors que mon surmoi de galérien a pris le dessus !
32+
33+
Je me note donc ça ici, histoire de pas oublier et que ça puisse resservir.
34+
35+
[Commenter cet article :fontawesome-solid-comments:](#__comments){: .md-button }
36+
{: align=middle }
37+
38+
## Avec pyproj
39+
40+
![logo PyProj](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/pyproj.png){: .img-rdp-news-thumb }
41+
42+
Si pyproj est installé :
43+
44+
```sh
45+
pip install pyproj
46+
```
47+
48+
Alors tout est presque trop facile :
49+
50+
```python
51+
import pyproj
52+
53+
print(pyproj.__proj_version__)
54+
```
55+
56+
## Avec les bindings GDAL
57+
58+
![logo GDAL](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/gdal.png){: .img-rdp-news-thumb }
59+
60+
Si GDAL est installée, ainsi que ses bindings Python :
61+
62+
```sh
63+
pip install gdal
64+
```
65+
66+
Alors on peut utiliser le package `osr` (dédié à l'abstraction sur les systèmes de coordonnées) :
67+
68+
```python
69+
from osgeo import osr
70+
71+
print(
72+
f"{osr.GetPROJVersionMajor()}."
73+
f"{osr.GetPROJVersionMinor()}."
74+
f"{osr.GetPROJVersionMicro()}"
75+
)
76+
```
77+
78+
## Avec le binaire proj et une regex
79+
80+
![logo PROJ](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/proj.png){: .img-rdp-news-thumb }
81+
82+
Mais si on ne peut compter sur aucune des couches d'abstraction précédentes, alors ça se corse. Il faut appeler l'exécutable de proj et se débrouiller avec la sortie par défaut puisqu'il n'y a pas d'option `--version` :
83+
84+
```sh
85+
> proj
86+
Rel. 8.2.1, January 1st, 2022
87+
usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]
88+
```
89+
90+
Et qu'est ce qu'on fait quand on a doit chercher une structure de texte dans un texte non formaté ? eh bien on ~~se débat~~ s'exprime à la régulière. Joie.
91+
92+
```python
93+
import re
94+
import subprocess
95+
96+
proj_output = check_output(["proj"], stderr=STDOUT, text=True)
97+
version_match = re.search(r"Rel\. ([0-9.]+)", proj_output):
98+
if version_match:
99+
print(version_match.group(1))
100+
```
101+
102+
## Mais ça, c'était aujourd'hui
103+
104+
![logo open source](https://cdn.geotribu.fr/img/logos-icones/opensource.png){: .img-rdp-news-thumb }
105+
106+
En tout cas, ça valait le coup de demander autour de moi et auprès de mes collègues puisque Loïc Bartoletti a proposé d'intégrer l'option `--version` à proj ! C'est dans cette [Pull Request](https://github.com/OSGeo/PROJ/pull/3836) que ça se passe et on y apprend plein de choses :
107+
108+
- que certains des [utilitaires packagés avec proj](https://proj.org/en/9.2/apps/index.html) disposent eux d'une option `--version` : `cct --version` et `gie --version`. Il y a donc une incohérence entre les différents CLI qu'il fait bon de mettre en lumière et résoudre.
109+
- que la [demande ne date pas d'hier](https://github.com/OSGeo/PROJ/issues/2640) (mais qu'un malheureux bot avait occulté)
110+
- que j'aurais pu creuser davantage quand j'ai regardé [comment pyproj se débrouille pour déterminer la version de PROJ](https://github.com/pyproj4/pyproj/blob/1452ba404be58c14a6b64d4551c320022f5aafcf/setup.py#L33-L53)
111+
112+
Et surtout que l'open source communautaire, c'est fichtrement vertueux !
113+
114+
----
115+
116+
## Auteur {: data-search-exclude }
117+
118+
--8<-- "content/team/jmou.md"
119+
120+
{% include "licenses/beerware.md" %}

0 commit comments

Comments
 (0)