外部Pythonライブラリに依存するプラグインの開発


29

私はPythonプラグインを開発しています。ターゲットは「昇格」と呼ばれるPyPI Pythonライブラリの機能をQGISに統合しています。

外部Pythonライブラリをインストールし、Pythonプラグインで使用できるようにするOSに依存しない方法はありますか?

外部のPython依存関係をインストールするためのさまざまなシステム固有の手順を既に知っています。私がやりたいのは、人々を夢中にさせずにさまざまな環境にプラグインを配布することです。

私がすでに知っていること

Webやその他の同様の質問を検索すると、OSに依存しないソリューションはないようです。

Windowsユーザー

PythonはQGISパッケージ内にパッケージ化されて配布されているため、外部Pythonライブラリをインストールするには、OSGeo4Wシェルを介してそこからpipを使用する必要があります。

関連リンク:

OS Xユーザー

この場合、QGISはOS X内にプリパッケージされ、次の場所にある組み込みPythonを使用します。

/usr/bin/python

ここでの問題は、デフォルトでインストールされるpipにはいくつかの制限があり、必要な特権が多すぎることです。

簡単な回避策は、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)

UnixのOS(Linuxでは、マックOS X)がインストールされている標準のPythonのバージョンを使用しているため、この手順は、Windowsのみのためである
遺伝子

私はそれを知っています、私は私の質問を「豊かにして」いました、今ではMac上でそれを行う方法を説明するOS Xユーザーセクションがあります。
エンジニア-G

1
Apple Pythonにpipを完全にインストールできます。QGISはこのバージョンを使用し、他のバージョン(Homebrew、Anacondaなど)は使用しません。あなたが自作のPythonを使用したい場合は、自作のQGISのバージョンをインストールする必要があります
遺伝子


3
純粋なpythonライブラリの場合、プラグインをサブパッケージ/モジュールとしてサードパーティライブラリを配布するだけです。
user2856

回答:


2

外部のPythonライブラリに依存するQGISでPythonスクリプトを実行するために、この問題に苦しみました。最も簡単な解決策は、コマンドラインに付属し、独自のpythonをインストールするBoundless Desktopをインストールすることです。コマンドラインを使用して、Pythonの外部パッケージを実行およびインストール(pipを使用)できます。


1

私は最近、プロジェクトでこれに少し取り組みました。残念ながら、これを達成するための素晴らしい方法はありません。あなたのソリューションは私が思いついたものと非常に似ていますが、ユーザーがpipをインストールしたという保証さえありません。

最終的に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 run(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.