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


17

Я намагався, поряд з цим постом , щоб запустити сценарій в OSGeo4w Shell , зовні 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
Для мене вікно PATH повинно бути встановлено таким чином "встановити", як це: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ trave \ trave-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>

чого достатньо, щоб ми помітили як шлях модуля ( 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, щоб ви зберігали єдину сітку Shapefile замість того, щоб створювати тимчасовий файл у кожному для циклу, що, здається, не потрібно.


Велике спасибі @gcarrillo, я перевірю це і звітую.
— Йосип

Ще раз дякую за допомогу! Я можу успішно імпортувати модулі! Але коли я запускаю ваш сценарій, я отримую помилку Traceback. Я відредагував питання, щоб включити це.
— Йосип

Ви забули створити папку Test/Grids/перед запуском сценарію.
— Герман Каррілло

Вибачте, я забув це згадати. Я створив /Grids/папку і створив файл grid.shp. Це прекрасно працює! Щось інше - проблема.
— Йосиф

Ви внесли якісь зміни / коригування сценарію? Я просто тестував його на GNU / Linux без проблем. Отримана помилка полягає в тому, що алгоритм Кліп не може отримати доступ до шляху path_dir + "Grids\grid.shp", який був биC:\Users\your_username\Desktop\Test\Grids\grid.shp
— Герман Каррільо

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.