OSGeo4w 쉘 스크립트를 실행할 때 qgis.core에 대한 가져 오기 오류


17

게시물 과 함께 QGIS 외부의 OSGeo4w Shell 에서 스크립트를 실행 하려고했습니다 . 그러나 다음과 같은 오류가 발생합니다.

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 오류가 발생합니다.

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를 올바르게 설정 했습니까? qgis 아이콘이 가리키는 qgis.bat에 설정된 것과 동일한 ENV 변수를 사용하여 스크립트를 실행하는 것이 좋습니다.
Luigi Pirelli

@LuigiPirelli에게 감사의 말을 전합니다.
조셉

@LuigiPirelli 귀하의 제안에 감사하지만 문제가 지속됩니다 (환경 변수를 잘못 추가하지 않은 한!)
Joseph

1
나에게 Windows PATH는 다음과 같이 "set"으로 설정해야합니다. set path = % OSGEO4W_ROOT % \ apps \ qgis \ bin; % OSGEO4W_ROOT % \ apps \ grass \ grass-6.4.3 \ lib; % PATH %
Stefan

답변:


17

마지막으로 PyQGIS 독립형 스크립트에서 처리 알고리즘을 실행하는 적절한 방법을 찾았습니다.

이 답변은 독립형 PyQGIS 스크립트를 작성할 때 import qgis.core 관련 문제점오류 : 알고리즘을 찾을 수 없음 에 대한 답변 을 기반으로하며, 이는 Qgis-dev 메일 링리스트 토론 을 기반으로합니다 .

OSGeo4W 쉘에서 QGIS 라이브러리를 사용하기 위해 독립형 PyQGIS 스크립트작성할 때 import qgis.core 문제점에 제공된 워크 플로우를 따르는 것이 좋습니다 . 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 루프에서 그리드 생성을 취했습니다.

이 트릭을해야합니다!


아름다운! 내 의견으로는이 답변을 훨씬 더 읽기 쉽고 컴팩트하게 받아 들일 것입니다. 다시 한번 감사합니다.
Joseph

이 스크립트 Processing는 데스크탑에 폴더에 포함 된 것과 유사한 폴더를 작성 /qgis.2합니다. 이것이 일어날까요?
Joseph

또한 shapefile을 읽고 동일한 빈 폴더를 작성하고 빈 'qgis'데이터베이스 파일을 추가합니다. 내가 수정하는 스크립트가 여러 폴더에서 shapefile을 가져 와서 새 파일 / 폴더가 팝업됨에 따라 상당히 성가신 것입니다. 나는 여전히 당신의 다른 답변 보다이 답변을 선호합니다.
조셉

맞습니다. @Joseph, 그 폴더의 생성에 대해 몰라, 처리 프레임 워크는 내가 이해할 수없는 어떤 이유로 든 폴더를 만듭니다. 나는 당신에게 동의합니다, 이것은 정답입니다. 추가 단계를 피하고 실제로 프레임 워크를 활용합니다. 현상금에 감사드립니다!
Germán Carrillo

2
이것은 매우 도움이됩니다. QGIS의 큰 약점으로 초보자는 간단한 스크립트를 작성할 수 있습니다. 이빨을 당기는 것과 같습니다.
Damien

7

이 답변은 독립형 PyQGIS 스크립트를 작성할 때 import qgis.core 관련 문제Python으로 '프로세스'에 액세스하는 방법 에 대한 답변을 기반으로합니다 . .

OSGeo4W 쉘에서 QGIS 라이브러리를 사용하기 위해 독립형 PyQGIS 스크립트작성할 때 import qgis.core 문제점에 제공된 워크 플로우를 따르는 것이 좋습니다 . QGIS 라이브러리가 올바르게 작동하면 독립 실행 형 PyQGIS 스크립트에서 처리 알고리즘 실행의 두 번째 부분으로 진행할 수 있습니다.

마찬가지로 어떻게 파이썬`processing` 액세스 할 수 있습니까? 이름별로 알고리즘을 실행할 수있을 때까지 해결 방법을 알려 드리겠습니다 (예 :) processing.runalg('provider:algorithm_name'). 처리 버전 2.2.0-2를 사용하고이 버전을 사용하는 것이 좋습니다.

QGIS Python 콘솔을 사용하여 플러그인 폴더를 처리 할 때 알고리즘 스크립트가 어디에 있는지 알아낼 수 있습니다. 예를 들어, 가져올 위치를 알려면 qgis:creategridQGIS 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()

이 트릭을해야합니다!

보시다시피, 모든 for 루프에 임시 파일을 만드는 대신 단일 그리드 Shapefile을 저장하기 위해 Test / Grids 폴더를 만들었습니다.


@gcarrillo에게 감사드립니다. 이것을 테스트하고 다시보고하겠습니다.
Joseph

당신의 도움에 다시 한번 감사드립니다! 모듈을 성공적으로 가져올 수 있습니다! 그러나 스크립트를 실행하면 Traceback 오류가 발생합니다. 이것을 포함하도록 질문을 편집했습니다.
Joseph

Test/Grids/스크립트를 실행하기 전에 폴더를 만드는 것을 잊었습니다 .
Germán Carrillo

미안, 나는 그것을 언급하는 것을 잊었다. 내가 생성 한 /Grids/폴더를하고 grid.shp 파일이 만들어집니다. 완벽하게 작동합니다! 다른 것이 문제입니다.
Joseph

스크립트를 변경 / 조정 했습니까? 방금 GNU / Linux에서 아무 문제없이 테스트했습니다. 당신이 얻는 오류는 Clip 알고리즘이 경로에 액세스 할 수 없기 때문에 발생합니다 path_dir + "Grids\grid.shp".C:\Users\your_username\Desktop\Test\Grids\grid.shp
독일 카리

4

@gcarrillo가 제공하는 스크립트를 약간 변경하여 OSGEO4W64 경로를 포함 시켰으며 (처음 독립형 설치 프로그램을 사용할 때 OSGEO4W64 설치 프로그램을 통해 QGIS를 다시 설치해야 함) 이중 슬래시를 포함시켜야했습니다. 마지막 스크립트는 다음과 같습니다. 모두의 도움에 감사드립니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.