Pages: 1
- Sujet précédent - QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ? - Sujet suivant
#1 Wed 04 January 2017 12:55
- lesjj10
- Participant occasionnel
- Date d'inscription: 18 Dec 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 Wed 04 January 2017 15:04
- lesjj10
- Participant occasionnel
- Date d'inscription: 18 Dec 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 (Wed 04 January 2017 15:14)
Hors ligne
#3 Thu 05 January 2017 08:40
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
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 (Thu 05 January 2017 08:41)
Hors ligne
#4 Fri 06 January 2017 16:39
- lesjj10
- Participant occasionnel
- Date d'inscription: 18 Dec 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 Mon 09 January 2017 14:00
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ?
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
Pages: 1
- Sujet précédent - QGIS 2.xx: Réalisation d'une Appli en Python avec les bibliothèques ? - Sujet suivant