एक स्वसंपूर्ण PyQGIS प्रसंस्करण स्क्रिप्ट में आयात का क्रम क्यों मायने रखता है?


13

मैं स्टैंडअलोन PyQGIS प्रसंस्करण स्क्रिप्ट चलाते समय एक अजीब मुद्दे पर आया हूं। स्क्रिप्ट में आयात का क्रम इसके सामान्य निष्पादन को प्रभावित करता है।

आप पायथन कंसोल को खोलकर और निम्न स्क्रिप्ट में प्रवेश करके समस्या को पुन: उत्पन्न कर सकते हैं (मैं GNU / Linux, QGIS 2.6.1, प्रोसेसिंग प्लगइन v.2.2.0-2 और पायथन 2.7.3 का उपयोग करता हूं):

# Prepare the environment
import sys
from qgis.core import QgsApplication
from PyQt4.QtGui import QApplication
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/YOUR_USER/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()

print Processing.getAlgorithm("qgis:creategrid")

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

आपको प्राप्त करना चाहिए:

ALGORITHM: Create grid
    HSPACING <ParameterNumber>
    VSPACING <ParameterNumber>
    WIDTH <ParameterNumber>
    HEIGHT <ParameterNumber>
    CENTERX <ParameterNumber>
    CENTERY <ParameterNumber>
    GRIDTYPE <ParameterSelection>
    CRS <ParameterCrs>
    SAVENAME <OutputVector>

दूसरी ओर, यदि आप आयात के क्रम को स्विच करते हैं (लाइनें 3 और 4), तो इस तरह से:

from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication

स्क्रिप्ट अब वापस आती है ... None, क्योंकि एल्गोरिथ्म नहीं मिला था।

इस समस्या का तात्पर्य है कि यदि आप (संयोग से) गलत क्रम में आयात लिखते हैं, तो आप QGIS से प्रसंस्करण एल्गोरिदम नहीं चला सकते।

मैंने StackOverflow में जाँच की है, लेकिन क्या पायथन आयात ऑर्डर मामले के अनुसार , ऑर्डर वास्तव में मायने नहीं रखता। इसके अलावा, पायथन कोड के लिए स्टाइल गाइड हमें मानक (अधिक सामान्य) पुस्तकालयों को पहले आयात करने के लिए कहता है, फिर संबंधित तीसरे पक्ष के पुस्तकालयों, और अंत में, स्थानीय अनुप्रयोग विशिष्ट आयात करता है। मुझे लगता है कि PyQt4 आयात की दूसरी श्रेणी में है, जबकि PyQGIS स्थानीय अनुप्रयोग विशिष्ट होगा, इसलिए PyQt4 आयात पहले आना चाहिए (मैं इस पर एक विशेषज्ञ नहीं हूं, हालांकि)।

क्या आपको अंदाजा है कि ऐसा क्यों हो सकता है? क्या आपने कभी ऐसा ही कुछ अनुभव किया है?


संपादित 1: @ माइक द्वारा सुझाए गए from abc import *अनुसार स्पष्ट आयात ( ) में परिवर्तन (जैसे from abc import xyz)।


2
बस कहना चाहता था, एक छोटा सा प्रतिलिपि प्रस्तुत करने योग्य उदाहरण और अनुसंधान और उस शोध के विश्लेषण के साक्ष्य के साथ उत्कृष्ट सवाल।
user2856

जवाबों:


14

tl; डॉ

import qgis
import PyQt4
etc

सही तरीका है

दीर्घ संस्करण

हाँ आयात आदेश मायने रख सकता है और QGIS 2.0 के मामले में और इससे ऊपर की बात है।

किसी भी PyQt सामान को आयात करने से पहले आपको हमेशा आयात करना चाहिए qgis.coreया qgis.guiयहां तक ​​कि बस import qgisपर्याप्त है।

वह मूर्खतापूर्ण लगता है। क्यों?

QGIS 2.0 में हमने SIP के संस्करण 2 बाइंडिंग का उपयोग करने के लिए स्विच किया जिससे API ने अधिक पायथन को कॉल किया जैसे कि यह आपके लिए ऑटो कन्वर्ट प्रकार:

1.0 SIP आपको करना था:

value.toString()

2.0 में

value

बस काम करेगा अगर यह C ++ कोड में एक स्ट्रिंग प्रकार है।

ठीक है तो क्या हुआ

किकर यह है कि हमें एपीआई संस्करण को कोड में 2 में सेट करना होगा, इससे पहले कि यह कुछ और सेट करे, आप इसे सेट करने के बाद इसे फिर से सेट नहीं कर सकते। यदि आप पहले PyQt को आयात करते हैं तो यह v1 में मान सेट करेगा लेकिन QGIS में सब कुछ अब v2 का उपयोग करता है। इसे ठीक करने के लिए हमने इसे v2 में सेट किया, qgis.__init__.pyलेकिन हमें qgisपहले आयात करना होगा या फिर PyQt जीतना होगा।

क्यूजीआईएस 2.0 और अब से ऊपर के सभी प्लगइन्स एसआईपी वी 2 का उपयोग करते हैं क्योंकि कॉल करते समय किसी भी एसआईपी v1 की तरह एक त्रुटि उत्पन्न होगी।


1
धन्यवाद नाथन, मुझे इस तरह के निहितार्थों के बारे में पता नहीं था। मुझे आश्चर्य है कि अगर यह मुद्दा PyQGIS डेवलपर्स के लिए अच्छी तरह से प्रलेखित है। उदाहरण के लिए, यह दिखाता है कि एक प्लगइन को कैसे दिखना चाहिए, और आयात के बारे में कुछ भी उल्लेख नहीं करता है। मुझे लगता है कि यह समस्या प्लगइन्स को उसी तरह प्रभावित नहीं करती है जैसे यह स्टैंडअलोन एप्लिकेशन / स्क्रिप्ट को प्रभावित करती है। (मैं आपके उत्तर को कुछ मिनटों में बढ़ा दूंगा, मैंने सभी दैनिक वोट पहले ही खर्च कर दिए हैं :))।
जर्मेन कारिलो

हां यह प्लगइन्स को प्रभावित नहीं करता है क्योंकि हम PyQt से पहले c ++ में qgis आयात करते हैं।
नाथन डब्ल्यू

अजीब बात है ... मुझे एक "ImportError: कोई मॉड्यूल नहीं मिला जिसका नाम PyQt" है, import PyQtहालांकि import qgisकाम करता है। ऐसा नहीं है कि यह मुझे इस मुद्दे पर परेशान करता है कि मुझे एक नया सवाल पूछने की ज़रूरत है, बस सोच रहा था कि क्या आप जानते हैं कि यह क्यों है। मैं विंडोज 7 का उपयोग उसी प्रसंस्करण / अजगर संस्करणों के साथ @gcarrillo के रूप में करता हूं।
जोसफ

यह मेरे द्वारा एक टाइपो है। संपादित देखें।
नाथन डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.