开发依赖于外部Python库的插件


29

我正在开发一个Python插件,目标是将称为“海拔”的PyPI Python库的功能集成到QGIS中。

有没有一种独立于操作系统的方式来安装外部Python库并使它们可用于Python插件?

我已经知道用于安装外部Python依赖项的不同系统特定过程,我想做的就是在不同环境中分布我的插件而不会让人发疯。

我已经知道的

搜索网络和其他类似问题,似乎没有独立于操作系统的解决方案。

Windows用户

Python打包并分发在QGIS软件包中,因此,要安装外部Python库,您必须先经过OSGeo4W Shell,然后从那里使用pip。

相关链接:

OS X用户

在这种情况下,QGIS使用内置的Python,它预先包装在OS X内,位于:

/usr/bin/python

这里的问题是,默认安装的pip有一些限制,并且需要太多特权。

一种快速的解决方法是使用自制软件安装Python,以便您的pip可以在用户可修改的Python框架上运行。在这里查看此方法的详细信息。

通过pip安装所有Python库之后,只需要将其目录添加到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版本
基因

我知道,我在“丰富”我的问题,现在有一个OS X用户部分,介绍了如何在Mac上进行操作。
G工程师-

1
您可以在Apple Python中完美安装pip。QGIS使用此版本,而不使用其他版本(Homebrew,Anaconda和其他版本)。如果要使用Homebrew Python,则需要安装QGIS的Homebrew版本
基因


3
如果它是纯python库,则可以将第3方库随插件一起作为子包/模块分发。
user2856

Answers:


2

我遇到了这个问题,无法在QGIS中运行Python脚本,该脚本依赖于外部Python库。最直接的解决方案是安装命令行附带的Boundless Desktop并安装自己的python。使用命令行,您可以运行和安装(使用pip)任何外部python软件包。


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时遇到问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.