Помилка імпорту для 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.