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 (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 को इस तरह "सेट" के साथ सेट किया जाना चाहिए: सेट पथ =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass- 6.4.3 \ lib;% PATH%
Stefan

जवाबों:


17

अंत में PyQGIS स्टैंडअलोन स्क्रिप्ट में प्रोसेसिंग एल्गोरिदम चलाने का उचित तरीका मिला।

यह उत्तर स्टैंड-अलोन PyQGIS स्क्रिप्ट लिखते समय और त्रुटि: Algorithm नहीं मिला , जो कि Qgis-dev मेलिंग-लिस्ट चर्चा के आधार पर है, को आयात qgis.core के साथ समस्या के उत्तर पर आधारित है ।

मेरा सुझाव है कि जब आप अपने QGIS पुस्तकालयों को अपने OSGeo4W शेल में सक्षम करने के लिए एक स्टैंड-अलोन PyQGIS स्क्रिप्ट लिख रहे हैं तो आयात qgis.core के साथ समस्या में दिए गए कार्य प्रवाह का पालन करें । एक बार जब आपके पास अपने QGIS पुस्तकालय ठीक से काम कर रहे हों, तो हम आपके प्रश्न के 2 भाग पर आगे बढ़ सकते हैं: एक स्टैंडअलोन PyQGIS स्क्रिप्ट में प्रोसेसिंग एल्गोरिदम चल रहा है।

मैंने आपकी मूल स्क्रिप्ट को थोड़ा संशोधित किया है और इसे विंडोज 7 और जीएनयू / लिनक्स पर परीक्षण किया है। मैं प्रसंस्करण संस्करण 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

ध्यान दें कि मैंने ग्रिड निर्माण को लूप के लिए निकाल लिया है, क्योंकि आपको प्रत्येक क्लिप को निष्पादित करने के लिए वास्तव में एक नए ग्रिड की आवश्यकता नहीं है।

यह काम कर जाना चाहिए!


सुंदर! इस जवाब को स्वीकार करेंगे क्योंकि यह मेरी राय में बहुत अधिक पठनीय और कॉम्पैक्ट है। बहुत बहुत धन्यवाद फिर से दोस्त!
जोसेफ

बस देखा कि यह स्क्रिप्ट Processingडेस्कटॉप पर एक फ़ोल्डर बनाता है , जो /qgis.2फ़ोल्डर में निहित के समान है । क्या ऐसा होना चाहिए?
जोसेफ

यह एक ही फ़ोल्डर भी बनाता है जिसमें से यह आकार-प्रकार पढ़ता है और एक खाली 'qgis' डेटा बेस फ़ाइल जोड़ता है। यह काफी कष्टप्रद है क्योंकि जिस स्क्रिप्ट को मैं संशोधित कर रहा हूं वह कई फ़ोल्डरों से आकार लेती है, जिसका अर्थ है कि ये नई फाइलें / फ़ोल्डर भी पॉप अप कर रहे हैं। मैं अभी भी आपके दूसरे के लिए इस जवाब को पसंद करता हूं।
जोसेफ

राइट @ जोसेफ, उन फ़ोल्डरों के निर्माण के बारे में नहीं जानता, प्रोसेसिंग फ्रेमवर्क उन्हें किसी भी कारण से बनाता है जो मुझे समझ में नहीं आता है। मैं आपसे सहमत हूं, यह उचित उत्तर है, यह आपको अतिरिक्त चरणों से बचाता है और वास्तव में रूपरेखा का लाभ उठाता है। इनाम के लिए धन्यवाद!
जर्मेन कैरिलो

2
यह बहुत मददगार है। QGIS की बड़ी कमजोरी शुरुआती लोगों को सरल स्क्रिप्ट लिखने की अनुमति देती है। यह दांत खींचने जैसा है।
डेमियन

7

यह उत्तर समस्या के उत्तर पर आधारित है आयात के साथ समस्या qgis.core जब एक स्टैंड-अलोन PyQGIS स्क्रिप्ट लिख रहा है और मैं पायथन के साथ `प्रोसेसिंग` का उपयोग कैसे कर सकता हूं?

मेरा सुझाव है कि जब आप अपने QGIS पुस्तकालयों को अपने OSGeo4W शेल में सक्षम करने के लिए एक स्टैंड-अलोन PyQGIS स्क्रिप्ट लिख रहे हैं तो आयात qgis.core के साथ समस्या में दिए गए कार्य प्रवाह का पालन करें । एक बार जब आपके पास अपने QGIS पुस्तकालय ठीक से काम कर रहे हों, तो हम आपके प्रश्न के 2 भाग पर आगे बढ़ सकते हैं: एक स्टैंडअलोन PyQGIS स्क्रिप्ट में प्रोसेसिंग एल्गोरिदम चल रहा है।

जैसे कि मैं पायथन के साथ `प्रोसेसिंग` का उपयोग कैसे कर सकता हूं? , जब तक मैं नाम (जैसे, processing.runalg('provider:algorithm_name')) द्वारा एल्गोरिदम चलाने में सक्षम नहीं होता, तब तक मैं आपको वर्कअराउंड दे दूंगा । मैं प्रसंस्करण संस्करण 2.2.0-2 का उपयोग करता हूं और आपको इस संस्करण का उपयोग करने का सुझाव देता हूं।

हम QGIS पायथन कंसोल का उपयोग यह पता लगाने के लिए कर सकते हैं कि एक एल्गोरिथ्म स्क्रिप्ट प्रसंस्करण प्लगइन फ़ोल्डर्स में कहाँ स्थित है। उदाहरण के लिए, यह जानना कि कहां से आयात करना qgis:creategridहै, QGIS पायथन कंसोल में लिखें:

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) दोनों को नोटिस करने के लिए पर्याप्त है । आप नीचे दी गई स्क्रिप्ट में इस जानकारी का उपयोग करेंगे।

मैंने आपकी स्क्रिप्ट को थोड़ा संशोधित किया है और इसे विंडोज 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()

यह काम कर जाना चाहिए!

जैसा कि आप देख सकते हैं, मैंने एक टेस्ट / ग्रिड फ़ोल्डर बनाया है ताकि आप लूप के लिए हर एक टेम्पोरल फाइल बनाने के बजाय एक सिंगल ग्रिड शेपफाइल को स्टोर कर सकें, जो जरूरी नहीं लगता है।


बहुत धन्यवाद @gcarrillo, मैं यह परीक्षण करेंगे और वापस रिपोर्ट करेंगे।
जोसेफ

फिर से, आपकी मदद के लिए धन्यवाद! मैं सफलतापूर्वक मॉड्यूल आयात कर सकता हूं! लेकिन जब मैं आपकी स्क्रिप्ट चलाता हूं, तो मुझे ट्रेसबैक त्रुटि मिलती है। मैंने इसे शामिल करने के लिए प्रश्न संपादित किया है।
जोसेफ

आप Test/Grids/स्क्रिप्ट चलाने से पहले फ़ोल्डर बनाना भूल गए ।
जर्मन कैरिलो

क्षमा करें, मैं इसका उल्लेख करना भूल गया। मैंने /Grids/फ़ोल्डर बनाया और ग्रिड.शिपी फ़ाइल बनाई गई है। यह पूरी तरह से काम करता है! कुछ और समस्या है।
जोसफ

क्या आपने स्क्रिप्ट में कोई बदलाव / समायोजन किया? मैंने बिना किसी समस्या के सिर्फ GNU / Linux पर इसका परीक्षण किया। त्रुटि आपको मिलती है क्योंकि क्लिप एल्गोरिथ्म पथ तक नहीं पहुंच path_dir + "Grids\grid.shp"सकता है, जो होगाC:\Users\your_username\Desktop\Test\Grids\grid.shp
जर्मेन कैरलिलो

4

मुझे OSGEO4W64 पथ को शामिल करने के लिए @gcarrillo द्वारा प्रदान की गई स्क्रिप्ट में मामूली बदलाव करना पड़ा (मुझे OSGO4W64 इंस्टॉलर के माध्यम से 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.