|
| 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 | +{: .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 | +{: .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 | +{: .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 | +{: .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 | +{: .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