#1 Sun 21 October 2012 21:23
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
QGIS : code fonctionne dans QGIS, plante en dehors
Bonjour,
Dans une application développée en python le code suivant (ajout d'un nouvel enregistrement dans une table Spatialite) ne fonctionne pas :
uri = QgsDataSourceURI()
uri.setDatabase( "C:/APPLI_PDT/CANAL_DEV/bd_canal.sqlite")
uri.setDataSource( "", "AOT_POINT", "GEOMETRY" )
layer = QgsVectorLayer( uri.uri(), "AOT", "spatialite" )
provider = layer.dataProvider()
feat = QgsFeature()
geometry = QgsGeometry()
feat.setAttributeMap({1:QtCore.QVariant(5)})
feat.setGeometry(geometry.fromPoint(QgsPoint(990650,110807)))
(res, outFeats) = provider.addFeatures( [ feat ] )
print str(res)
False
A contrario, la même séquence fonctionne dans Qgis (1.7.2) à partir de la console python.
J'ai beau chercher depuis un moment, ça coince...
Quel est la différence entre les deux environnements (l'environnement de développement est celui de QGis 1.7.2...) ?
Un petit coup de main serait le bienvenu. Merci !
Hors ligne
#2 Mon 22 October 2012 12:17
- jcr83
- Participant actif
- Date d'inscription: 17 Mar 2008
- Messages: 147
Re: QGIS : code fonctionne dans QGIS, plante en dehors
Un message d'erreur est affiché ?
Hors ligne
#3 Mon 22 October 2012 13:55
- VianneyD
- Participant assidu
- Date d'inscription: 30 May 2011
- Messages: 153
Re: QGIS : code fonctionne dans QGIS, plante en dehors
Bonjour,
Je ne connais pas le python mais j'avance tout de même une hypothèse :
Le code ne fait-il pas appel à une librairie QGis, qui ne serait pas présente dans l'autre environnement ?
Je pense aux objets de type QgsVectorLayer et QgsFeature par exemple...
Il vous faut peut-être simplement récupérer la librairie en question.
À creuser... à moins que je ne sois à côté de la plaque !
Vianney Dugrain
Hors ligne
#4 Tue 23 October 2012 08:43
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS : code fonctionne dans QGIS, plante en dehors
Non, juste la valeur de retour FALSE pour le "addFeatures"
(res, outFeats) = provider.addFeatures( [ feat ] ).
La cela devient un énervant, j'essayer toute les pistes sans succès...
Mon application est bien plus vaste que le bot de code que j'ai posté donc il y a pas mal de possibilités d'interférences, mais quand même.
J'ai essayé de voir autour du provider: RAS (en tout cas pas de piste sérieuse)
J'ai pensé un temps que compte-tenu fait que j'accède en parralèle à ma base Spatialite avec Qt pour afficher des données alpha dans différents widget il pouvait y avoir interférence mais en ajoutant au début de mon script la connexion avec Qt, cela fonctionne toujours (et toujours pas dans mon appli!)
A noter que j'ai essayé en passant non plus par le provider, mais par la layer, le résultat est le même:
Code:
layer.startEditing() feat = QgsFeature() geometry = QgsGeometry() feat.setAttributeMap({1:QtCore.QVariant(5)}) feat.setGeometry(geometry.fromPoint(QgsPoint(990650,110807))) #(990650,110807) self.qgsPoint res = layer.addFeatures([ feat ]) layer.commitChanges() res = False, et toujours pas d'insertion dans ma table...
Hors ligne
#5 Tue 23 October 2012 20:24
Re: QGIS : code fonctionne dans QGIS, plante en dehors
En fait, lorsque vous travaillez dans la console Python, un certains nombre de modules Python sont "préimportés" ce qui n'est pas le cas si vous travaillez en dehors de QGIS en voulant l'utiliser.
Par exemple, il faut importer les modules de QGIS:
Code:
import sys from qgis.core import * from qgis.gui import *
et autres....(pyspatialite etc.)
Pour examiner une application qui utilise QGIS depuis l'extérieur avec PostGIS, voir http://geotux.tuxfamily.org/index.php/e … ython-y-qt en Espagnol. C'est une application qui permet d'afficher les couches PostGIS et les codes sont disponibles.
Dernière modification par gene (Tue 23 October 2012 21:55)
Hors ligne
#6 Wed 24 October 2012 07:56
- jcr83
- Participant actif
- Date d'inscription: 17 Mar 2008
- Messages: 147
Re: QGIS : code fonctionne dans QGIS, plante en dehors
En dehors de la console Python Qgis, j'obtiens un message d'erreur :
Code:
$ python test.py Traceback (most recent call last): File "test.py", line 1, in <module> uri = QgsDataSourceURI() NameError: name 'QgsDataSourceURI' is not defined
Donc je pense que Sylvain a effectué les imports nécessaires.
Dernière modification par jcr83 (Wed 24 October 2012 07:57)
Hors ligne
#7 Thu 25 October 2012 10:04
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS : code fonctionne dans QGIS, plante en dehors
Tout est en ordre de marche de ce côté-là.
J'ai un peu progressé dans l'identification de la source du problème mais pas encore dans la solution.
En fait le problème provient d'un accès simultané à la base spatialite:
Je me connecte deux fois à la base, une fois avec PyQgis pour aller chercher les couches géographiques,
Code:
uri = QgsDataSourceURI() uri.setDatabase( self.dirDBcanal ) uri.setDataSource( "", layername, "GEOMETRY" )
une autre fois avec Qt pour aller chercher les données alpha affichées dans les widgets de l'interface
Code:
self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE") self.db.setDatabaseName(self.dirDBcanal) self.db.open() self.mdlAOT = QtSql.QSqlRelationalTableModel(self.aotGui, self.db)
.
Si je by-pass la dernière ligne, je peux insérer des objets dans mes layers,
Code:
(res, outFeats) = provider.addFeatures( [ feat ] )
(renvoie True)
sinon renvoie False.
Il y a une possibilité côté Qt de mettre la base en mode "partagé" par:
Code:
self.db.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE=1")
Mai cela ne suffit pas, il faudrait pouvoir faire la même chose avec QgsDataSourceURI, mais là ca coince...
Il y a bien une fonction setParam de la classe QgsDataSourceURI mais à priori très récemment implémenté et donc absente des version 1.7.2 et 1.8 de QGis sur lesquelles je travaille...
Hors ligne