He estado tratando, junto con este post, para ejecutar una secuencia de comandos en OSGeo4w Shell, fuera de QGIS. Pero me sale el siguiente error:
ImportError: No module named qgis.core
También he leído los siguientes puestos de trabajo y trató de importación de varios módulos, pero fue en vano:
- Cómo ejecutar los algoritmos de sextante fuera de qgis consola de python?
- Cómo ejecutar una simple secuencia de comandos de python para QGIS desde el exterior (por ejemplo, Sublime Text)?
- Cómo escribir secuencias de comandos de Python independiente utilizando QGIS?
Aquí es un simple script que crea una cuadrícula y clips de un shapefile de polígonos en ella. Cualquier ayuda en la obtención de esta secuencia de comandos para trabajar fuera de QGIS sería muy apreciada. Nota: Este script ha sido 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
EDITAR:
Tras la respuesta y la secuencia de comandos publicado por @gcarrillo, por fin puedo importar el qgis.core.
módulos con éxito. La secuencia de comandos proporcionada por @gcarrillo (muchas, muchas gracias!) se ejecuta pero recibo un error de Trazas:
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'
Actualización:
Tuve que hacer pequeños cambios en la secuencia de comandos proporcionada por @gcarrillo para incluir la OSGEO4W64 ruta (tuve que volver a instalar QGIS a través de la OSGEO4W64 instalador como he usado el instalador independiente inicialmente) y para incluir doble barras. Aquí está el final de la secuencia de comandos 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 = QApplication([])
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