Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoRezo est partenaire média de la Conférence Francophone SIG 2017 organisée par ESRI.

Les bénévoles de l'association seront présents les 11 et 12 Octobre aux Docks de Paris.

Le programme est riche, mais vous trouverez bien un  moment pour venir faire une pause au stand GeoRezo, et rencontrer les animateurs du portail francophone de la géomatique.

Nous serons à votre écoute pour partager avec vous notre passion pour l’animation du portail GeoRezo.

L'équipe GeoRezo

#1 mer. 04 janvier 2017 12:55

lesjj10
Membre
Date d'inscription: 18 déc. 2014
Messages: 16

QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?

Bonjour,

Je souhaite réaliser une application en python utilisant les bibliothèques de QGIS mais sans lancer ce SIG (les plugins QGIS ne répondent pas à mon besoin). J'ai déjà exposé mon problème sur un forum de dévelloppement Python http://www.developpez.net/forums/d16200 … ciel-qgis/ mais, n'ayant pas de réponse, je me demande si j'ai frappé à la bonne porte.

J'ai consulté différentes pages pour trouver des solutions mais aucune ne fonctionne.

J'ai installé différentes versions de QGis (2.6, 2.14, 2.16, 2.18 et la 2.18 via OSGeo4W) : les résultats sont toujours identiques.

Je suis en windows 10.
Je lance l'invite de commande (cmd.exe) via OSGeo4W.bat. Je suis les recommandations lues http://geospatialdesktop.com/2009/02/cr … ication_1/ ( If you are using the OsGeo4W install of QGIS, all you need to do is start the OsGeo4w shell. No setting of the PYTHONPATH is required). Je lance python. Puis j'essaye d'importer la bibliothèque qgis.core.

Code:

C:\OSGeo4W64>python
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyQt4.QtCore
>>> import PyQt4.QtGui
>>> import qgis.core
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named qgis.core

Cette erreur me laisse à penser que la variable sys.path est incomplète. Je précise tout de suite que ces imports se déroulent sans problème depuis la console python de QGIS.

Code:

>>>  import sys
>>> print str(sys.path)
['', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\matplotlib-1.3.1-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\nose-1.3.3-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\tornado-4.0.1-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\backports.ssl_match_hostname-3.4.0.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\certifi-14.05.14-py2.7.egg', 'c:\\osgeo4~1\\apps\\python27\\lib\\site-packages\\python_dateutil-2.1-py2.7.egg', 'C:\\OSGEO4~1\\bin\\python27.zip', 'C:\\OSGEO4~1\\apps\\Python27\\DLLs', 'C:\\OSGEO4~1\\apps\\Python27\\lib', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\plat-win', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\lib-tk', 'C:\\OSGEO4~1\\bin', 'C:\\OSGEO4~1\\apps\\Python27', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\PIL', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\jinja2-2.7.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\pytz-2012j-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\win32', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\Shapely-1.2.18-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\xlrd-0.9.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg']

En effet, les bibliothèques de QGIS n'apparraissent pas. Par contre, elles sont présentent dans la variable sys.path de la console Python de QGIS (cf les deux premiers éléments de la variable sys.path). Je ne comprends pas pourquoi la valeur de la variable sys.path est différente dans la console OSGeo4W et dans la console QGIS.

Code:

Console Python
Utilisez iface pour accéder à l'interface de l'API QGIS ou tapez help(iface) pour plus d'informations
import sys
print str(sys.path) #console QGIS
['C:/OSGEO4~1/apps/qgis/./python/plugins\\processing', 'C:/OSGEO4~1/apps/qgis/./python', u'C:/Users/geomajic/.qgis2/python', u'C:/Users/geomajic/.qgis2/python/plugins', 'C:/OSGEO4~1/apps/qgis/./python/plugins', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\matplotlib-1.3.1-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\nose-1.3.3-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\tornado-4.0.1-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\backports.ssl_match_hostname-3.4.0.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\certifi-14.05.14-py2.7.egg', 'c:\\osgeo4~1\\apps\\python27\\lib\\site-packages\\python_dateutil-2.1-py2.7.egg', 'C:\\OSGEO4~1\\bin\\python27.zip', 'C:\\OSGEO4~1\\apps\\Python27\\DLLs', 'C:\\OSGEO4~1\\apps\\Python27\\lib', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\plat-win', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\lib-tk', 'C:\\OSGEO4~1\\bin', 'C:\\OSGEO4~1\\apps\\Python27', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\PIL', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\jinja2-2.7.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\pytz-2012j-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\win32', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\Shapely-1.2.18-py2.7-win-amd64.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\xlrd-0.9.2-py2.7.egg', 'C:\\OSGEO4~1\\apps\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg', u'C:/Users/geomajic/.qgis2//python', 'C:\\Users\\geomajic\\.qgis2\\python\\plugins\\CEERAT_Regroupement\\outils', 'C:\\Users\\geomajic\\.qgis2\\python\\plugins\\opeNoise\\tools', 'C:\\Users\\geomajic\\.qgis2\\python\\plugins']

J'ai réalisé une appli pour exporter la valeur de sys.path dans un fichier texte et une seconde pour supprimer les éléments de la variable sys.path et les remplacer par ceux enregistrés dans ce fichier texte, puis je lance également les imports.

Code:

C:\OSGeo4W64>python c:\qgis\code_python\I_qgis.py 64_Q
taille de sys.path avant suppression : 26

effacement du contenu de sys.path
taille de sys.path apres suppression: 0

import des elements sauvegardes dans sys.path
taille de sys.path apres import : 34

lancement des imports
import PyQt4.QtCore
import PyQt4.QtGui
import qgis.core
Traceback (most recent call last):
  File "c:\qgis\code_python\I_qgis.py", line 58, in <module>
    import qgis.core
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\__init__.py", line 26, in <module>
    from qgis.PyQt import QtCore
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\PyQt\QtCore.py", line 28, in <module>
    sip.setapi(api, 2)
ValueError: API 'QDate' has already been set to version 1

Je modifie la ligne 28 du fichier QtCore.py (Après modification, je ne peux plus charger PyQGIS dans QGIS. Le support Python va être désactivé.)

Code:

C:\OSGeo4W64>python c:\qgis\code_python\I_qgis.py 64_Q
taille de sys.path avant suppression : 26

effacement du contenu de sys.path
taille de sys.path apres suppression: 0

import des elements sauvegardes dans sys.path
taille de sys.path apres import : 34

lancement des imports
import PyQt4.QtCore
import PyQt4.QtGui
import qgis.core
Traceback (most recent call last):
  File "c:\qgis\code_python\I_qgis.py", line 58, in <module>
    import qgis.core
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\__init__.py", line 26, in <module>
    from qgis.PyQt import QtCore
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\PyQt\QtCore.py", line 38, in <module>
    from PyQt4.QtCore import QPyNullVariant
ImportError: cannot import name QPyNullVariant

Je modifie le fichier QtCore.py pour qu'il n'y ait plus de référence à QPyNullVariant.

Code:

C:\OSGeo4W64>python c:\qgis\code_python\I_qgis.py 64_Q
taille de sys.path avant suppression : 26

effacement du contenu de sys.path
taille de sys.path apres suppression: 0

import des elements sauvegardes dans sys.path
taille de sys.path apres import : 34

lancement des imports
import PyQt4.QtCore
import PyQt4.QtGui
import qgis.core
Traceback (most recent call last):
  File "c:\qgis\code_python\I_qgis.py", line 58, in <module>
    import qgis.core
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\__init__.py", line 27, in <module>
    from qgis.core import QgsFeature, QgsGeometry
  File "C:/OSGEO4~1/apps/qgis/./python\qgis\core\__init__.py", line 30, in <module>
    from qgis._core import *
ImportError: DLL load failed: Le module spÚcifiÚ est introuvable.

Le fichier qgis._core est présent.

Hors ligne

 

#2 mer. 04 janvier 2017 15:04

lesjj10
Membre
Date d'inscription: 18 déc. 2014
Messages: 16

Re: QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?

Après avoir présenté mon problème, j'ai regardé la discussion http://georezo.net/forum/viewtopic.php?pid=278855. Elle m'a inspiré et je me suis dit que c'était peut-être un problème de paramètrage.

J'ai regardé le fichier OSGeo4W.bat

Code:

@echo off
rem Root OSGEO4W home dir to the same directory this script exists in
call "%~dp0\bin\o4w_env.bat"

rem List available o4w programs
rem but only if osgeo4w called without parameters
@echo on
@if [%1]==[] (cmd.exe /k o-help) else (cmd /c "%*")

puis le fichier o4w_env.bat

Code:

REM Make parent of this script location our current directory,
REM converting UNC path to drive letter if needed
pushd %~dp0
cd ..

REM set OSGEO4W_ROOT to short path version
for %%i in ("%CD%") do set OSGEO4W_ROOT=%%~fsi

REM start with clean path
set path=%OSGEO4W_ROOT%\bin;%WINDIR%\system32;%WINDIR%;%WINDIR%\WBem

for %%f in ("%OSGEO4W_ROOT%\etc\ini\*.bat") do call "%%f"

popd

et le fichier qgis.bat (puisse que les imports fonctionnent avec la console QGIS)

Code:

@echo off
call "%~dp0\o4w_env.bat"
@echo off
path %OSGEO4W_ROOT%\apps\qgis\bin;%PATH%
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis
set GDAL_FILENAME_IS_UTF8=YES
rem Set VSI cache to be used as buffer, see #6448
set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt4\plugins
start "QGIS" /B "%OSGEO4W_ROOT%"\bin\qgis-bin.exe %*

J'ai modifié le fichier o4w_env.bat en ajoutant une valeur à path trouvée dans qgis.bat et en déclarant la variable PYTHONPATH. Le fichier obtenu est :

Code:

REM Make parent of this script location our current directory,
REM converting UNC path to drive letter if needed
pushd %~dp0
cd ..

REM set OSGEO4W_ROOT to short path version
for %%i in ("%CD%") do set OSGEO4W_ROOT=%%~fsi

REM start with clean path
set path=%OSGEO4W_ROOT%\bin;%WINDIR%\system32;%WINDIR%;%WINDIR%\WBem;%OSGEO4W_ROOT%\apps\qgis\bin
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python 

for %%f in ("%OSGEO4W_ROOT%\etc\ini\*.bat") do call "%%f"

Avec ce fichier modifié, je peux importer la bibliothèque qgis.core, quelques soit la version de QGIS.

Code:

C:\Program Files\QGIS 2.16>python
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import qgis.core

Par contre j'ai toujours des problèmes lorsque je lance mon script pour faire plusieurs imports.

Code:

C:\Program Files\QGIS 2.16>python c:\\qgis\\code_python\\I_qgis.py

lancement des imports
import PyQt4.QtCore
import PyQt4.QtGui
import qgis.core
Traceback (most recent call last):
  File "c:\\qgis\\code_python\\I_qgis.py", line 58, in <module>
    import qgis.core
  File "C:\PROGRA~1\QGIS2~1.16\apps\qgis\python\qgis\__init__.py", line 26, in <module>
    from qgis.PyQt import QtCore
  File "C:\PROGRA~1\QGIS2~1.16\apps\qgis\python\qgis\PyQt\QtCore.py", line 28, in <module>
    sip.setapi(api, 2)
ValueError: API 'QDate' has already been set to version 1

En fait j'ai constaté que le problème venait de l'ordre des imports. En effet, quand je commence par qgis et non par PyQt4, tout ce passe bien :

Code:

C:\Program Files\QGIS 2.16>python c:\\qgis\\code_python\\I_qgis.py

lancement des imports
import qgis.gui
import PyQt4.QtCore
import PyQt4.QtGui
import qgis.core

Ce qui me surprend tout de même c'est que l'ordre n'a pas d'importance dans la console python de QGIS. Il y a peut être un paramètre à modifier.

La page http://geospatialdesktop.com/2009/02/cr … ication_1/ précisait qu'avec l'installation OSGeo4W, il n'y a aucun paramètre à modifier. C'était certainement vrai en 2009 mais ce n'est plus le cas en 2017, au moins pour Windows.

Dernière modification par lesjj10 (mer. 04 janvier 2017 15:14)

Hors ligne

 

#3 jeu. 05 janvier 2017 08:40

Sylvain PIERRE
Membre
Lieu: Strasbourg
Date d'inscription: 6 sept. 2005
Messages: 150

Re: QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?

Bonjour,

Si je peux me permettre tout ça me parait un peu compliqué ;-)!

Pour lancer une application Python incluant les librairies QGIS (python + pyqgis) on peut faire ça avec un .bat  (valable pour une 2.12 à adapter selon la version):

Code:

SET OSGEO4W_ROOT=C:\Program Files\QGIS Lyon
SET PYTHONPATH=%OSGEO4W_ROOT%\apps\Python27;%OSGEO4W_ROOT%\apps\Python27\Lib;%OSGEO4W_ROOT%\apps\Python27\sip;%OSGEO4W_ROOT%\apps\qgis\python
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
SET QGISHOME=C:\Program Files\QGIS Lyon
SET GDAL_DATA=%OSGEO4W_ROOT%\share\gdal
SET QGIS_DEBUG=-1
SET QGIS_LOG_FILE=C:\TEMP\qgis.log
SET QGIS_DEBUG_FILE=C:\TEMP\qgis-debug.log

PATH=%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis\bin;%PATH%

start /B pythonw C:\xxxxxx\appli_canal.pyw

Quel framework de développement utilisez-vous?
Si vous n'en utilisez pas encore je vous conseille de le faire.
Pour ma part j'utilise Eclipse + pydev. Cela vous donne à un accès à un environnement complet pour tester vos développements.

Cordialement

Sylvain

Dernière modification par Sylvain PIERRE (jeu. 05 janvier 2017 08:41)

Hors ligne

 

#4 ven. 06 janvier 2017 16:39

lesjj10
Membre
Date d'inscription: 18 déc. 2014
Messages: 16

Re: QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?

Merci bien.

Je me suis inspiré de votre réponse pour réaliser un fichier .bat qui me permet de lancer mon application sans problème.

Mon fichier .bat :

Code:

SET OSGEO4W_ROOT=C:\OSGeo4W64
set path=%OSGEO4W_ROOT%\bin;%WINDIR%\system32;%WINDIR%;%WINDIR%\WBem;%OSGEO4W_ROOT%\apps\qgis\bin
SET PYTHONPATH=%OSGEO4W_ROOT%\apps\Python27;%OSGEO4W_ROOT%\apps\Python27\Lib;%OSGEO4W_ROOT%\apps\Python27\sip;%OSGEO4W_ROOT%\apps\qgis\python
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
SET QGISHOME=C:\OSGeo4W64

Hors ligne

 

#5 lun. 09 janvier 2017 14:00

lejedi76
Membre
Date d'inscription: 8 août 2013
Messages: 223

Re: QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?

lesjj10 a écrit:

Ce qui me surprend tout de même c'est que l'ordre n'a pas d'importance dans la console python de QGIS. Il y a peut être un paramètre à modifier.

Réponse ici pour les anglophones : http://gis.stackexchange.com/questions/ … ing-script

Ensuite pour revenir à ce que tu cherches à faire, il y a aussi la possibilité d'exécuter des scripts python en lançant qgis en ligne de commande.
Après il faut peut-être autoriser l’exécution de macro au préalable. Mais l'avantage c'est que si ton script s'exécute dans la console, il s’exécutera parfaitement via un .bat.

Code:

set QGIS="C:\Program Files (x86)\QGIS\bin\qgis.bat"
set QGIS_PLUGIN="C:\Program Files (x86)\QGIS\profil\python\plugins\"
%QGIS% --nologo --code script.py

Cordialement,

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |