Suite

Exécuter ogr2ogr à partir de python


J'ai essayé d'exécuter ogr2ogr à partir de python avec cette commande shell :

ogr2ogr.exe --config PG_LIST_ALL_TABLES OUI -f "PostgreSQL" -append PG:"host=hostnamet user=username password=password dbname=dbname" nasfile.xml

La solution rapide et sale avecos.systemne fonctionne pas. Il n'y a aucune donnée dans la base de données après avoir exécuté ce script :

import os loadfile = pathfile.xml command = "C:Program FilesQGIS Chugiakinogr2ogr.exe --config PG_LIST_ALL_TABLES YES -f "PostgreSQL" -append PG:"host =nom d'hôte utilisateur=nom d'utilisateur mot de passe=mot de passe dbname=dbname" " + loadfile os.system(commande)

Quelle est la bonne syntaxe pour l'exécuter avecsous-processus.appel?


sous-processus.appeletsubprocess.check_callles deux prennent des listes avec des chaînes en entrée et séparent chaque argument par un espace vide. Votre commande serait :

import os, subprocess base_path = "some/file/path" loadfile = os.path.join(base_path, "file.xml") command = ["C:Program FilesQGIS Chugiakinogr2ogr. exe", "--config", "PG_LIST_ALL_TABLES", "YES", "-f", "PostgreSQL", "-append", "PG:"host=hostname user=username password=password dbname=dbname" ", loadfile] subprocess.check_call(commande)

Certaines choses que j'ai apprises à la dure :

  1. Utilisationsubprocess.check_callavec les utilitaires de ligne de commande GDAL car, contrairement àappel, il génère une erreur lorsque le code de retour est différent de zéro, c'est-à-dire que votre commande a échoué.

  2. Essayez d'utiliseros.chemindans la mesure du possible car il se charge de connecter vos chemins de fichiers avec les bons séparateurs en fonction du système sur lequel le code est exécuté.

edit : à partir de GDAL 2.1, vous pouvez également appelerogr2ogren fonction avecgdal.VectorTranslate- voir le journal des modifications avec des exemples.


J'ajoute cette réponse ici comme alternative à celle de Kersten, car les chaînes de citation et d'échappement de Kersten dans la réponse généreront des erreurs sur Linux ("ne peut pas se connecter à la base de données"). Ce qui suit montre l'annotation correcte pour se connecter à une base de données PostGRES, tout en observant le strict respect de GDAL aux entrées de chaîne/variable.

*Prenez note de l'absence de guillemets entourant les paramètres de connexion à la base de données après le PG : partie de la chaîne, qui est tangentielle à ce à quoi la plupart des programmeurs sont habitués lorsqu'ils utilisent PostGIS, GDAL et ogr2ogr.

def somefunction() : # importez les données essayez : def load(args): options = ['/usr/bin/ogr2ogr'] options.extend(args) # enregistrez la sortie ! subprocess.check_call(options,stderr=subprocess.STDOUT) load(['-t_srs', srcsrs, '-s_srs', srcsrs, '-explodecollections', '-f', 'PostgreSQL', 'PG:dbname=% host =localhost port=5432 user=postgres password=somepass' % somedb, '/some/path/file.ext', '--config', 'PG_USE_COPY', 'YES', '-nln', 'tablename', ' -overwrite','-skipfailures']) # enregistre une erreur s'il y en a une sauf subprocess.CalledProcessError comme e: print(str(e.output))

La réponse de Kersten me donne l'erreur suivante lors de la tentative d'insertion dans une table dans postgreSQL :

ERREUR 1 : PQconnectdb a échoué. option de connexion invalide "" hôte "

J'ai dû supprimer les guillemets dans"PG:"host=nom d'hôte utilisateur=nom d'utilisateur mot de passe=mot de passe dbname=dbname"".

En utilisant"PG:hôte=nom d'hôte utilisateur=nom d'utilisateur mot de passe=mot de passe dbname=dbname"travaillé pour moi.


Voir la vidéo: GDAL. Ogr2Ogr - Conversion de données - PostgreSQL (Octobre 2021).