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

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

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

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

Windows用户

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

QGIS独立模块和Python模块
在OSGeo4W Python中安装Python setuptools
如何安装第三方Windows上用于QGIS的python库?

OS X用户

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

/usr/bin/python


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

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

通过pip安装所有Python库后,只需将它们的目录添加到PATH变量中。 >在插件Python代码内部,您可以使用系统提供的pip来安装所需的软件包。然后,您可以使刚刚安装的软件包可访问并将其添加到路径中。 br />我决定采用另一种方法,因为它允许将库的更新和维护与插件分开。每次有新用户安装插件时,pip都会直接下载并安装最新版本的海拔库,并在插件的子目录中进行安装。

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


评论

此过程仅适用于Windows,因为Unix OS(Linux,Mac OS X)使用已安装的标准Python版本。

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

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

还看看插件的依赖关系,一个点子安装插件可能吗?第一:Osgeo4w Shell有什么区别?和QGIS列表中的许多其他帖子

如果它是纯python库,则可以将带有插件的第三方库作为子包/模块进行分发。

#1 楼

对于插件用户而言,最方便的解决方案是将轮子捆绑在插件内部。下载wheel,将其放在您的插件文件夹中,然后从那里导入。

try:
    import elevation
except ImportError:
    import sys
    import os
    this_dir = os.path.dirname(os.path.realpath(__file__))
    path = os.path.join(this_dir, 'elevation-x.y.z-py2.py3-none-any.whl')
    sys.path.append(path)
    import elevation


评论


我不知道轮文件是可导入的。谢谢。 +1

–库布拉·努尔(KübraNur)
20-09-16在12:44

#2 楼

这对我有用(在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)


并设置虚拟环境。

在Windows中似乎一个不同的故事。我在安装matplotlib时遇到问题。

#3 楼

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

#4 楼

我最近在一个项目上做了一些工作。不幸的是,确实没有实现这一目标的好方法。您的解决方案与我提出的解决方案非常相似,但是并不能保证用户甚至已经安装了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'])


当然,另一种选择是包括库本身在您插件的目录中。您可能会冒险提供旧版本,但是从理论上讲这并不重要。

#5 楼

也许您可以尝试virtualenv安装外部依赖项。这样,您不必担心系统环境。

https://www.fullstackpython.com/application-dependencies.html

#6 楼

当QGIS在Linux系统上使用预安装的python时,您可以执行sudo pip install <package>,但这会使默认设置混乱。您的/home/<user>/QGIS/venv与往常一样。接下来要做的就是在脚本内部添加以下行,然后导入<package>
import_path = os.path.join('/home/<user>/QGIS/venv/lib/python3.7/site-packages')
sys.path.insert(0, import_path)
import <package>

现在将找到已安装的<package>