Ошибка импорта для qgis.core при запуске сценария оболочки OSGeo4w

17

Вместе с этим постом я пытался запустить скрипт в оболочке OSGeo4w вне QGIS. Но я получаю следующую ошибку:

ImportError: нет модуля с именем qgis.core

Я также прочитал следующие посты и попытался импортировать различные модули, но безрезультатно:

Вот простой скрипт, который создает сетку и накладывает на нее многоугольный шейп-файл.

Примечание. Этот скрипт был протестирован и успешно работает при запуске в 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

После ответа и сценария, опубликованного @gcarrillo, я наконец смог qgis.core.успешно импортировать модули. Сценарий, предоставленный @gcarrillo, запускается, но я получаю сообщение об ошибке трассировки:

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'
Джозеф
источник
1
Вы правильно установили PYTHONPATH? Я предлагаю запустить скрипт с теми же переменными ENV, которые установлены в файле qgis.bat, указанном значком qgis.
Луиджи Пирелли,
Спасибо @LuigiPirelli, я сделаю это и сообщу.
Иосиф
Спасибо за ваше предложение @LuigiPirelli, но проблема все еще остается (если я не добавил переменные среды неправильно!)
Джозеф
1
Для меня Windows PATH должен быть установлен с «set» следующим образом: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

Ответы:

17

Наконец-то нашли правильный способ запуска алгоритмов обработки в автономных скриптах PyQGIS.

Этот ответ основан на ответах на проблему с импортом qgis.core при написании автономного скрипта PyQGIS и на ошибку: алгоритм не найден , что, в свою очередь, основано на обсуждении в списке рассылки Qgis-dev .

Я предлагаю вам следовать рабочему процессу, указанному в разделе Проблема с импортом qgis.core, при написании автономного скрипта PyQGIS для включения библиотек QGIS в оболочку OSGeo4W. После того, как ваши библиотеки QGIS работают должным образом, мы можем перейти ко второй части вашего вопроса: запуску алгоритмов обработки в автономном скрипте PyQGIS.

Я немного изменил ваш оригинальный скрипт и протестировал его в Windows 7 и GNU / Linux. Я использую обработку версии 2.2.0-2 и предлагаю вам использовать эту версию, которая является текущей на момент написания ответа.

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

Обратите внимание, что я вынул создание сетки из цикла for, так как вам не нужна новая сетка для выполнения каждого клипа.

Это должно сработать!

Герман Каррильо
источник
Прекрасный! Приму этот ответ, так как он гораздо более читаемый и компактный, по крайней мере, на мой взгляд. Спасибо большое снова приятель!
Иосиф
Просто заметил, что этот скрипт создает Processingпапку на рабочем столе, аналогичную той, которая содержится в /qgis.2папке. Должно ли это случиться?
Иосиф
Он также создает ту же папку, из которой он читает шейп-файлы, и добавляет пустой файл базы данных «qgis». Что довольно раздражает, так как скрипт, который я модифицирую, берет шейп-файлы из нескольких папок, что означает, что эти новые файлы / папки также появляются. Я все еще предпочитаю этот ответ вашему другому.
Джозеф
Прямо @Joseph, не знаю о создании этих папок, среда обработки создает их по любой причине, которую я не понимаю. Я согласен с вами, это правильный ответ, он избегает дополнительных шагов и фактически использует преимущества фреймворка. Спасибо за награду!
Герман Каррильо
2
Это очень полезно. Большая слабость QGIS позволяет начинающим писать простые сценарии. Это как вырывать зубы.
Дэмиен
7

Этот ответ основан на ответах на Проблема с импортом qgis.core при написании автономного скрипта PyQGIS и на Как я могу получить доступ к «обработке» с помощью Python? ,

Я предлагаю вам следовать рабочему процессу, указанному в разделе Проблема с импортом qgis.core, при написании автономного скрипта PyQGIS для включения библиотек QGIS в оболочку OSGeo4W. После того, как ваши библиотеки QGIS работают должным образом, мы можем перейти ко второй части вашего вопроса: запуску алгоритмов обработки в автономном скрипте PyQGIS.

Как в Как я могу получить доступ к `обработке` с помощью Python? Я дам вам обходной путь, пока не смогу запустить алгоритмы по имени (например, processing.runalg('provider:algorithm_name')). Я использую обработку версии 2.2.0-2 и предлагаю вам использовать эту версию.

Мы можем использовать консоль QGIS Python, чтобы выяснить, где находится скрипт алгоритма в папках плагина обработки. Например, чтобы узнать, откуда импортировать qgis:creategrid, напишите в консоли QGIS Python:

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

Вы должны получить:

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

этого достаточно, чтобы мы заметили и модуль path ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms), и класс алгоритма ( mmqgisx_grid_algorithm). Вы будете использовать эту информацию в сценарии ниже.

Я немного изменил ваш скрипт и протестировал его в Windows 7. Возможно, вам придется скорректировать пути, чтобы запустить скрипт в вашей собственной среде.

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()

Это должно сработать!

Как вы можете видеть, я создал папку Test / Grids, чтобы вы сохраняли отдельный шейп-файл сетки вместо создания временного файла в каждом цикле for, что, по-видимому, не нужно.

Герман Каррильо
источник
Большое спасибо @gcarrillo, я проверю это и сообщу.
Джозеф
Еще раз спасибо за вашу помощь! Я могу успешно импортировать модули! Но когда я запускаю ваш скрипт, я получаю сообщение об ошибке трассировки. Я отредактировал вопрос, чтобы включить это.
Джозеф
Вы забыли создать папку Test/Grids/перед запуском скрипта.
Герман Каррильо
Извините, я забыл упомянуть об этом. Я создал /Grids/папку и файл grid.shp создан. Это работает отлично! Проблема в другом.
Джозеф
Вносили ли вы какие-либо изменения / корректировки в сценарий? Я только что проверил его на GNU / Linux без проблем. Ошибка, которую вы получаете, состоит в том, что алгоритм Clip не может получить доступ к пути path_dir + "Grids\grid.shp", который был быC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo
4

Мне пришлось внести небольшие изменения в сценарий, предоставляемый @gcarrillo, чтобы включить путь OSGEO4W64 (мне пришлось переустановить QGIS через установщик OSGEO4W64, так как я изначально использовал автономный установщик) и включить двойные слэши. Вот финальный сценарий и большое спасибо всем за помощь:

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
Джозеф
источник