एक प्लगइन का विकास जो एक बाहरी पायथन लाइब्रेरी पर निर्भर करता है


29

मैं एक पायथन प्लगइन विकसित कर रहा हूं, लक्ष्य QGIS में एक PyPI पायथन लाइब्रेरी की कार्यक्षमता को एकीकृत कर रहा है जिसे 'उन्नयन' कहा जाता है।

क्या बाहरी पायथन पुस्तकालयों को स्थापित करने और उन्हें पायथन प्लगइन्स को उपलब्ध कराने का एक स्वतंत्र तरीका है?

मैं पहले से ही बाहरी पायथन निर्भरता स्थापित करने के लिए अलग-अलग सिस्टम विशिष्ट प्रक्रियाओं को जानता हूं, जो मैं करना चाहता हूं वह यह है कि लोगों को पागल बनाने के बिना विभिन्न वातावरणों में अपने प्लगइन को वितरित करना है।

जो मुझे पहले से पता है

वेब और इसी तरह के अन्य प्रश्नों की खोज से ऐसा लगता है कि ओएस स्वतंत्र समाधान नहीं है।

विंडोज उपयोगकर्ता

अजगर को क्यूजीआईएस पैकेज के अंदर पैक और वितरित किया जाता है, इसलिए बाहरी पायथन पुस्तकालयों को स्थापित करने के लिए आपको OSGeo4W शेल के माध्यम से जाना होगा और वहां से पाइप का उपयोग करना होगा।

सम्बंधित लिंक्स:

ओएस एक्स उपयोगकर्ता

इस स्थिति में QGIS अंतर्निहित पायथन का उपयोग करता है जो OS X के अंदर पहले से ही स्थित है और उस पर स्थित है:

/usr/bin/python

यहां मुद्दा यह है कि डिफ़ॉल्ट रूप से स्थापित पाइप की कुछ सीमाएं हैं और बहुत अधिक विशेषाधिकारों की आवश्यकता है।

पायथन को स्थापित करने के लिए एक त्वरित समाधान घर-का उपयोग करना है ताकि आपका पाइप उपयोगकर्ता-परिवर्तनीय पायथन ढांचे के खिलाफ चल सके। इस दृष्टिकोण का विवरण यहां देखें

पाइप के माध्यम से सभी पायथन पुस्तकालयों को स्थापित करने के बाद, आपको बस उनके निर्देशिका को पाथ चर में जोड़ना होगा।

ओएस एक्स उपयोगकर्ताओं के लिए वैकल्पिक तरीका

प्लगइन पायथन कोड के अंदर आप आवश्यक पैकेजों को स्थापित करने के लिए सिस्टम द्वारा प्रदान किए गए पाइप का उपयोग कर सकते हैं। तब आप पथ में इसे जोड़ने के लिए बस स्थापित पैकेज बना सकते हैं।

import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")

घर का बना लेकिन काम कर समाधान (दोनों लिनक्स और ओएस एक्स पर परीक्षण)

मैंने वैकल्पिक तरीके से जाने का फैसला किया क्योंकि यह लाइब्रेरी अपडेट और रखरखाव को प्लगइन से अलग रखने की अनुमति देता है। हर बार जब कोई नया उपयोगकर्ता प्लगइन स्थापित करता है तो एलिवेशन लाइब्रेरी का नवीनतम संस्करण सीधे प्लग इन के एक उपनिर्देशिका के अंदर पाइप द्वारा डाउनलोड और इंस्टॉल किया जाता है।

self.plugin_dir = os.path.dirname(__file__)
self.elevation_dir = os.path.join(self.plugin_dir, 'elevation')

# Checking the presence of elevation library
try:
    import elevation
except:
    pip.main(['install', '--target=%s' % self.elevation_dir, 'elevation'])
    if self.elevation_dir not in sys.path:
        sys.path.append(self.elevation_dir)

यह प्रक्रिया केवल विंडोज के लिए है क्योंकि यूनिक्स ओएस (लिनक्स, मैक ओएस एक्स) स्थापित मानक पायथन संस्करण का उपयोग करते हैं
जीन

मुझे पता है, मैं अपने सवाल को 'समृद्ध' कर रहा था, अब एक ओएस एक्स उपयोगकर्ता अनुभाग है जो बताता है कि इसे मैक पर कैसे करना है।
इंजीनियर-जी

1
आप ऐप्पल पायथन में पाइप को पूरी तरह से स्थापित कर सकते हैं। QGIS इस संस्करण का उपयोग करता है न कि अन्य संस्करणों (Homebrew, Anaconda और अन्य) का। यदि आप Homebrew Python का उपयोग करना चाहते हैं, तो आपको
जीन


3
यदि यह एक शुद्ध अजगर पुस्तकालय है, तो आप बस अपने प्लगइन के साथ 3 पार्टी लाइब्रेरी को एक सबपैकेज / मॉड्यूल के रूप में वितरित कर सकते हैं।
user2856

जवाबों:


2

मुझे इस मुद्दे के माध्यम से QGIS में पायथन स्क्रिप्ट चलाने के लिए सामना करना पड़ा जो एक बाहरी पायथन लाइब्रेरी पर निर्भर करता है। सबसे सीधा समाधान असीम डेस्कटॉप स्थापित करना है जो कमांड लाइन के साथ आता है और अपने स्वयं के अजगर को स्थापित करता है। कमांड लाइन का उपयोग करके आप अजगर के किसी भी बाहरी पैकेज को चला सकते हैं और स्थापित कर सकते हैं (पाइप का उपयोग करके)।


1

मैंने हाल ही में एक प्रोजेक्ट पर इस पर थोड़ा काम किया। दुर्भाग्य से वास्तव में इसे प्राप्त करने का एक शानदार तरीका नहीं है। आपका समाधान मेरे साथ आया हुआ समान है, लेकिन इसकी कोई गारंटी नहीं है कि उपयोगकर्ता ने पाइप स्थापित किया है।

मैंने इसे उपलब्ध नहीं होने पर केस में चलाने के लिए get_pip.py की कॉपी और एक्सेफाइल () का उपयोग करके समाप्त कर दिया ।

अपने अंतिम समाधान के समान:

self.plugin_dir = os.path.dirname(__file__)

try:
    import pip
except:
    execfile(os.path.join(self.plugin_dir, get_pip.py))
    import pip
    # just in case the included version is old
    pip.main(['install','--upgrade','pip'])

try:
    import somelibrary
except:
    pip.main(['install', 'somelibrary'])

एक विकल्प, निश्चित रूप से, पुस्तकालय को अपने प्लगइन की निर्देशिका में शामिल करना होगा। आप एक पुराना संस्करण प्रदान करने का जोखिम उठाते हैं, लेकिन सैद्धांतिक रूप से यह कोई मायने नहीं रखेगा।


1

शायद आप बाहरी निर्भरता स्थापित करने के लिए virtualenv की कोशिश कर सकते हैं। इस तरह, आपको सिस्टम वातावरण के बारे में चिंता करने की ज़रूरत नहीं है।

https://www.fullstackpython.com/application-dependencies.html


1

इसने मेरे लिए काम किया (डीईएफ रन में (स्व)):

    def load_libraries(self):
        import_path = os.path.join(self.plugin_dir, 'lib/python2.7/site-packages')
        sys.path.insert(0, import_path)

और एक virtualenv की स्थापना।

विंडोज के साथ यह एक अलग कहानी लगती है। मुझे matplotlib स्थापित करने में परेशानी हुई।

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