Harici bir Python kütüphanesine bağlı bir eklentinin geliştirilmesi


29

Bir Python eklentisi geliştiriyorum, hedef 'yükseklik' olarak adlandırılan bir PyPI Python kütüphanesinin işlevlerini QGIS ile bütünleştiriyor.

Harici Python kütüphaneleri kurmanın ve onları Python eklentileri için kullanılabilir kılmanın işletim sisteminden bağımsız bir yolu var mı?

Harici bir Python bağımlılığı kurmak için farklı sisteme özgü prosedürleri zaten biliyorum, yapmak istediğim, insanları çıldırtmadan eklentimi farklı ortamlara dağıtmak.

Ne biliyordum

Web'de ve diğer benzer sorularda arama yapmak, işletim sisteminden bağımsız bir çözüm bulunmuyor gibi görünüyor.

Windows kullanıcıları

Python, QGIS paketi içinde paketlenir ve dağıtılır, bu nedenle harici Python kütüphanelerini kurabilmek için OSGeo4W Shell'den geçmeli ve oradan pip kullanmalısınız.

İlgili Bağlantılar:

OS X Kullanıcıları

Bu durumda QGIS, OS X içinde önceden paketlenmiş ve şu adreslerde bulunan yerleşik Python'u kullanır:

/usr/bin/python

Buradaki sorun, varsayılan yüklenen piponun bazı sınırlamaları olması ve çok fazla ayrıcalık gerektirmesidir.

Hızlı bir çözüm, Pip'inizin kullanıcı tarafından değiştirilebilen bir Python çerçevesine karşı çalışabilmesi için Python'u kurmak için ev demiri kullanmaktır. Bu yaklaşımın ayrıntılarına buradan bakın .

Tüm Python kütüphanelerini pip üzerinden yükledikten sonra, dizinlerini PATH değişkenine eklemeniz yeterlidir.

OS X kullanıcıları için alternatif yol

Eklenti Python kodu içinde, gerekli paketleri kurmak için sistem tarafından sağlanan pip'i kullanabilirsiniz. Daha sonra, yeni kurulan paketi yola ekleyerek ulaşılabilir hale getirebilirsiniz.

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

Ev yapımı ancak çalışma çözümü (hem Linux hem de OS X'te test edilmiştir)

Kütüphane güncellemesini ve bakımını eklentiden ayrı tutmaya izin verdiği için alternatif yoldan gitmeye karar verdim. Yeni bir kullanıcı eklentiyi her yüklediğinde, yükseltme kütüphanesinin en son sürümü eklentinin bir alt dizinine pip tarafından doğrudan indirilir ve yüklenir.

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)

Bu işlem yalnızca Windows içindir, çünkü Unix OS (Linux, Mac OS X) yüklü standart Python sürümünü kullanır
gene

Biliyorum, sorumu 'zenginleştiriyordum', şimdi bir mac üzerinde nasıl yapılacağını açıklayan bir OS X kullanıcıları bölümü var.
Mühendis-G,

1
Pip'i Apple Python'a mükemmel bir şekilde kurabilirsiniz. QGIS bu sürümü kullanır ve diğerlerini değil (Homebrew, Anaconda ve diğerleri). Homebrew Python'u kullanmak istiyorsanız, QGIS'in Homebrew sürümünü kurmanız gerekiyor
gen


3
Saf bir python kütüphanesi ise, 3. parti kütüphaneyi eklentinizle birlikte alt paket / modül olarak dağıtabilirsiniz.
user2856,

Yanıtlar:


2

Qtg'de Python betiklerini çalıştırmak için harici bir Python kütüphanesine bağlı olan bu sorunla uğraştım. En basit çözüm, komut satırıyla birlikte gelen ve kendi pythonunu yükleyen Sınırsız Masaüstü'nü kurmaktır. Komut satırını kullanarak herhangi bir harici python paketini çalıştırabilir ve yükleyebilirsiniz (pip kullanarak).


1

Bu konuda biraz önce bir projede çalıştım. Maalesef bunu başarmanın gerçekten harika bir yolu yok. Çözümünüz benim bulduğum şeye çok benziyor ancak kullanıcının pip kurulumu konusunda hiçbir garanti yok.

Get_pip.py'nin bir kopyasını da ekledim ve uygun olmadığında çalıştırmak için execfile () işlevini kullandım.

Son çözümünüze benzer:

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 olarak, elbette, kütüphanenin kendisini eklentinizin dizinine dahil etmek de mümkün olacaktır. Eski bir sürüm sunma riskiniz var ancak teorik olarak önemi yok.



1

Bu benim için çalıştı (def çalıştırmak (öz)):

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

ve bir sanalenv kurma.

Windows ile olsa farklı bir hikaye gibi görünüyor. Matplotlib'i kurarken sorun yaşadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.