การพัฒนาปลั๊กอินซึ่งขึ้นอยู่กับไลบรารี Python ภายนอก


29

ฉันกำลังพัฒนาปลั๊กอิน Python เป้าหมายกำลังรวมเข้ากับ QGIS ซึ่งเป็นฟังก์ชันของไลบรารี PyPI Python ที่เรียกว่า 'การยกระดับ'

มีวิธีที่เป็นอิสระจากระบบปฏิบัติการของการติดตั้งห้องสมุด Python ภายนอกและทำให้พวกเขาสามารถใช้ได้กับปลั๊กอิน Python

ฉันรู้แล้วว่าขั้นตอนเฉพาะของระบบที่แตกต่างกันสำหรับการติดตั้งการพึ่งพา Python ภายนอกสิ่งที่ฉันต้องการจะทำคือการเผยแพร่ปลั๊กอินของฉันในสภาพแวดล้อมที่แตกต่างกันโดยไม่ทำให้ผู้คนคลั่งไคล้

สิ่งที่ฉันรู้แล้ว

ค้นหาเว็บและคำถามที่คล้ายกันอื่น ๆ ดูเหมือนว่าไม่มีวิธีแก้ไขปัญหา OS แบบอิสระ

ผู้ใช้งาน Windows

Python ได้รับการบรรจุและแจกจ่ายภายในแพ็คเกจ QGIS ดังนั้นในการติดตั้ง Python library ภายนอกคุณต้องผ่าน OSGeo4W Shell และใช้ pip จากที่นั่น

ลิงก์ที่เกี่ยวข้อง:

ผู้ใช้ OS X

ในกรณีนี้ QGIS ใช้ Python ในตัวซึ่งได้รับการบรรจุล่วงหน้าใน OS X และอยู่ที่:

/usr/bin/python

ปัญหาที่นี่คือจุดเริ่มต้นที่ติดตั้งไว้มีข้อ จำกัด บางอย่างและต้องใช้สิทธิ์มากเกินไป

วิธีแก้ปัญหาอย่างรวดเร็วคือใช้ home-brew เพื่อติดตั้ง Python เพื่อให้ pip ของคุณสามารถทำงานกับกรอบ Python ที่ผู้ใช้สามารถแก้ไขได้ ดูรายละเอียดของวิธีการนี้ที่นี่

หลังจากติดตั้งไลบรารี Python ทั้งหมดผ่าน pip คุณเพียงแค่เพิ่มไดเรกทอรีของพวกเขาไปยังตัวแปร PATH

ทางเลือกสำหรับผู้ใช้ OS X

ภายในโค้ด Python ของปลั๊กอินคุณสามารถใช้ pip ที่ระบบจัดเตรียมไว้ให้เพื่อติดตั้งแพ็คเกจที่ต้องการ จากนั้นคุณสามารถทำให้แพคเกจที่เพิ่งติดตั้งสามารถเข้าถึงได้เพิ่มเข้าไปในเส้นทาง

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

โฮมเมด แต่วิธีการทำงาน (ทดสอบบน Linux และ OS X)

ฉันตัดสินใจที่จะใช้วิธีอื่นเนื่องจากจะทำให้การอัปเดตห้องสมุดและการบำรุงรักษาแยกจากปลั๊กอิน ทุกครั้งที่ผู้ใช้ใหม่ติดตั้งปลั๊กอินเวอร์ชันล่าสุดของไลบรารีการยกระดับความสูงจะถูกดาวน์โหลดและติดตั้งโดยตรงโดย pip ภายในไดเรกทอรีย่อยของปลั๊กอิน

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)

ขั้นตอนนี้ใช้สำหรับ Windows เท่านั้นเนื่องจาก Unix OS (Linux, Mac OS X) ใช้เวอร์ชัน Python มาตรฐานที่ติดตั้งไว้
gene

ฉันรู้ว่าฉันเป็น 'เพิ่มคุณค่า' คำถามของฉันตอนนี้มีส่วนผู้ใช้ OS X ที่อธิบายวิธีการทำบน mac
Engineer-G

1
คุณสามารถติดตั้ง pip ได้อย่างสมบูรณ์ใน Apple Python QGIS ใช้รุ่นนี้และไม่ใช่รุ่นอื่น (Homebrew, Anaconda และอื่น ๆ ) หากคุณต้องการใช้ Homebrew Python คุณจะต้องติดตั้ง QGIS รุ่น Homebrew
ยีน


3
หากเป็นคลังหลามบริสุทธิ์คุณสามารถแจกจ่ายไลบรารี่ของบุคคลที่สามพร้อมกับปลั๊กอินของคุณเป็นแพ็กเกจย่อย / โมดูล
2856

คำตอบ:


2

ฉันประสบปัญหานี้ในการเรียกใช้สคริปต์ Python ใน QGIS ซึ่งขึ้นอยู่กับห้องสมุด Python ภายนอก ทางออกที่ตรงไปตรงมาที่สุดคือการติดตั้ง Boundless Desktop ที่มาพร้อมกับบรรทัดคำสั่งและติดตั้งหลามของตัวเอง การใช้บรรทัดคำสั่งคุณสามารถเรียกใช้และติดตั้ง (โดยใช้ pip) แพ็คเกจภายนอกใด ๆ ของหลาม


1

ฉันทำงานเกี่ยวกับโครงการนี้เมื่อไม่นานมานี้ น่าเสียดายที่ไม่มีวิธีที่ดีในการบรรลุเป้าหมาย โซลูชันของคุณคล้ายกับสิ่งที่ฉันคิดไว้ แต่ไม่มีการรับประกันว่าผู้ใช้จะติดตั้งจุดเล็ก ๆ

ฉันลงเอยด้วยการรวมเอาget_pip.pyและใช้ execfile () เพื่อเรียกใช้ในกรณีที่ไม่สามารถใช้งานได้

คล้ายกับโซลูชันสุดท้ายของคุณ:

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

สิ่งนี้ใช้ได้สำหรับฉัน (ใน def def (self)):

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

และตั้งค่า virtualenv

ด้วย Windows ดูเหมือนว่าจะเป็นเรื่องที่แตกต่าง ฉันมีปัญหาในการติดตั้ง matplotlib

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.