Pengembangan plugin yang tergantung pada pustaka Python eksternal

29

Saya sedang mengembangkan plugin Python, targetnya adalah mengintegrasikan ke dalam QGIS fungsi-fungsi pustaka PyPI Python yang disebut 'elevation'.

Apakah ada cara independen OS untuk menginstal pustaka Python eksternal dan membuatnya tersedia untuk plugin Python?

Saya sudah tahu prosedur khusus sistem yang berbeda untuk menginstal ketergantungan Python eksternal, yang ingin saya lakukan adalah mendistribusikan plugin saya di lingkungan yang berbeda tanpa membuat orang menjadi gila.

Apa yang sudah saya ketahui

Mencari di web dan pertanyaan serupa lainnya sepertinya tidak ada solusi independen OS.

Pengguna Windows

Python dikemas dan didistribusikan di dalam paket QGIS, jadi untuk menginstal pustaka Python eksternal Anda harus melalui OSGeo4W Shell dan menggunakan pip dari sana.

tautan yang berhubungan:

Pengguna OS X

Dalam hal ini QGIS menggunakan Python bawaan yang dipaket dalam OS X dan terletak di:

/usr/bin/python

Masalahnya di sini adalah bahwa pip yang diinstal default memiliki beberapa keterbatasan dan membutuhkan terlalu banyak hak istimewa.

Solusi cepatnya adalah menggunakan home-brew untuk menginstal Python sehingga pip Anda dapat berjalan melawan kerangka Python yang dapat dimodifikasi pengguna. Lihat detail dari pendekatan ini di sini .

Setelah menginstal semua pustaka Python melalui pip, Anda hanya perlu menambahkan direktori mereka ke variabel PATH.

Cara alternatif untuk pengguna OS X

Di dalam kode Python plugin Anda dapat menggunakan pip yang disediakan oleh sistem untuk menginstal paket yang diperlukan. Kemudian Anda dapat membuat paket yang baru diinstal dapat dicapai dengan menambahkannya ke jalur.

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

Solusi buatan sendiri tetapi berfungsi (diuji pada Linux dan OS X)

Saya memutuskan untuk mencari cara alternatif karena memungkinkan untuk menjaga pembaruan dan pemeliharaan perpustakaan terpisah dari plugin. Setiap kali pengguna baru menginstal plugin, versi terbaru dari elevation library langsung diunduh dan diinstal oleh pip di dalam subdirektori plugin.

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)
Engineer-G
sumber
Prosedur ini hanya untuk Windows karena Unix OS (Linux, Mac OS X) menggunakan versi Python standar yang diinstal
gen
Saya tahu itu, saya 'memperkaya' pertanyaan saya, sekarang ada bagian pengguna OS X yang menjelaskan bagaimana melakukannya di mac.
Engineer-G
1
Anda dapat memasang pip dengan sempurna di Apple Python. QGIS menggunakan versi ini dan bukan versi yang lain (Homebrew, Anaconda, dan lainnya). Jika Anda ingin menggunakan Homebrew Python, Anda perlu menginstal versi Homebrew dari QGIS
gen
3
Jika itu adalah pustaka python murni, Anda bisa mendistribusikan pustaka pihak ke-3 dengan plugin Anda sebagai subpackage / modul.
user2856

Jawaban:

2

Saya menderita melalui masalah ini untuk menjalankan skrip Python di QGIS yang tergantung pada pustaka Python eksternal. Solusi paling mudah adalah dengan menginstal Boundless Desktop yang datang dengan baris perintah dan menginstal python sendiri. Menggunakan baris perintah Anda dapat menjalankan dan menginstal (menggunakan pip) paket python eksternal.

osmjit
sumber
1

Saya mengerjakan ini sedikit pada proyek baru-baru ini. Sayangnya tidak ada cara yang bagus untuk mencapai ini. Solusi Anda sangat mirip dengan apa yang saya buat, tetapi tidak ada jaminan pengguna bahkan telah menginstal pip.

Saya akhirnya menyertakan salinan get_pip.py dan menggunakan execfile () untuk menjalankannya jika tidak tersedia.

Mirip dengan solusi akhir Anda:

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'])

Alternatif, tentu saja, adalah memasukkan perpustakaan itu sendiri ke direktori plugin Anda. Anda berisiko menyediakan versi lama, tetapi secara teoritis itu tidak masalah.

Jesse McMillan
sumber
1

Ini bekerja untuk saya (dalam def (diri)):

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

dan mengatur virtualenv.

Dengan Windows sepertinya cerita yang berbeda. Saya kesulitan menginstal matplotlib.

geekdenz
sumber