Error de importación para qgis.core al ejecutar el script de shell OSGeo4w

16

Lo he estado intentando, junto con este post , para ejecutar un script en OSGeo4w Shell , fuera de QGIS. Pero me sale el siguiente error:

  

ImportError: no hay un módulo llamado qgis.core

También he leído las siguientes publicaciones y he intentado importar varios módulos pero en vano:

Aquí hay un script simple que crea una cuadrícula y enlaza un shapefile de polígono en ella.

Nota: Este script se ha probado y funciona correctamente cuando se ejecuta en QGIS.

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\"
path_res = path_dir + "Results\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Siguiendo la respuesta y el script publicado por @gcarrillo, finalmente puedo importar los módulos qgis.core. con éxito. El script proporcionado por @gcarrillo se ejecuta pero recibo un error de Traceback:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'
    
pregunta Joseph 12.01.2015 - 13:42

3 respuestas

16

Finalmente, encontré la forma correcta de ejecutar algoritmos de procesamiento en los scripts independientes de PyQGIS.

Esta respuesta se basa en las respuestas a Problema con la importación de qgis.core al escribir un script PyQGIS independiente y a Error: Algorithm no encontrado , que a su vez se basa en un discusión de la lista de correo de Qgis-dev .

Le sugiero que siga el flujo de trabajo que se encuentra en Problema con la importación de qgis.core al escribir una secuencia de comandos de PyQGIS independiente para habilitar sus bibliotecas QGIS en su OSGeo4W Shell. Una vez que tenga sus bibliotecas QGIS funcionando correctamente, podemos continuar con la segunda parte de su pregunta: ejecutar algoritmos de procesamiento en un script de PyQGIS independiente.

He modificado un poco su script original y lo he probado en Windows 7 y GNU / Linux. Uso la versión de procesamiento 2.2.0-2 y le sugiero que use esta versión, que es la actual en el momento de escribir la respuesta.

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\"
path_res = path_dir + "Results\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Tenga en cuenta que he eliminado la creación de la cuadrícula del bucle for, ya que realmente no necesita una nueva cuadrícula para realizar cada clip.

¡Esto debería hacer el truco!

    
respondido por el Germán Carrillo 14.01.2015 - 21:33
6

Esta respuesta se basa en las respuestas a Problema con la importación de qgis.core al escribir una secuencia de comandos de PyQGIS independiente y a ¿Cómo puedo acceder al 'procesamiento' con Python? .

Le sugiero que siga el flujo de trabajo que se encuentra en Problema con la importación de qgis.core al escribir una secuencia de comandos de PyQGIS independiente para habilitar sus bibliotecas QGIS en su OSGeo4W Shell. Una vez que tenga sus bibliotecas QGIS funcionando correctamente, podemos continuar con la segunda parte de su pregunta: ejecutar algoritmos de procesamiento en un script de PyQGIS independiente.

Como en ¿Cómo puedo acceder? ¿procesando 'con Python? , le daré una solución hasta que pueda ejecutar los algoritmos por nombre (por ejemplo, processing.runalg('provider:algorithm_name') ). Uso la versión de procesamiento 2.2.0-2 y le sugiero que use esta versión.

Podemos usar la consola QGIS Python para averiguar dónde se encuentra un script de algoritmo en el procesamiento de carpetas de complementos. Por ejemplo, para saber desde dónde importar qgis:creategrid , escriba en la consola Python de QGIS:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

Deberías obtener:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

que es suficiente para que notemos la ruta del módulo ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms ) y la clase de algoritmo ( mmqgisx_grid_algorithm ). Utilizará esta información en el siguiente script.

He modificado un poco tu script y lo he probado en Windows 7. Es posible que tengas que ajustar las rutas para ejecutar el script en tu propio entorno.

import os
import glob
import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

app = QApplication([])
QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\"
path_res = path_dir + "Results\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

¡Esto debería hacer el truco!

Como puede ver, he creado una carpeta de Pruebas / Cuadrículas para que almacene un único Shapefile de cuadrícula en lugar de crear un archivo temporal en cada bucle for, que no parece ser necesario.

    
respondido por el Germán Carrillo 14.01.2015 - 04:05
3

Tuve que hacer pequeños cambios en la secuencia de comandos proporcionada por @gcarrillo para incluir la ruta OSGEO4W64 (tuve que reinstalar QGIS a través del instalador OSGEO4W64 ya que usé el instalador independiente inicialmente) e incluir barras dobles. Aquí está el guión final y muchas gracias a todos por su ayuda:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QgsApplication([]) # instantiation of QgsApplication
QgsApplication.setPrefixPath("C:\OSGeo4W64\apps\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\"
path_res = path_dir + "Results\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS
    
respondido por el Joseph 05.04.2016 - 12:49

Lea otras preguntas en las etiquetas