Ошибка импорта для 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.