Python 如何正确地将第三方依赖项与Sublime文本插件一起使用?

Python 如何正确地将第三方依赖项与Sublime文本插件一起使用?,python,sublimetext3,Python,Sublimetext3,我正在尝试为Sublime Text 3编写一个插件 我必须在代码中使用几个第三方软件包。通过手动将包复制到/home/user/.config/sublime-text-3/packages/user/中,我成功地使代码正常工作,然后使用相对导入获得所需的代码。如何将插件分发给最终用户?告诉他们将所需的依赖项复制到适当的位置肯定不是办法。第三方模块应该如何与Sublime文本插件一起正确使用?我在网上找不到任何文档;我看到的只是将模块放入文件夹的建议。Sublime使用它自己的嵌入式Pytho

我正在尝试为Sublime Text 3编写一个插件


我必须在代码中使用几个第三方软件包。通过手动将包复制到
/home/user/.config/sublime-text-3/packages/user/
中,我成功地使代码正常工作,然后使用相对导入获得所需的代码。如何将插件分发给最终用户?告诉他们将所需的依赖项复制到适当的位置肯定不是办法。第三方模块应该如何与Sublime文本插件一起正确使用?我在网上找不到任何文档;我看到的只是将模块放入文件夹的建议。

Sublime使用它自己的嵌入式Python解释器(目前是Python 3.3.6,尽管下一个版本也将支持Python 3.8),因此它将完全忽略系统上可能安装或未安装的任何Python版本,以及为该版本安装的任何库

因此,如果您想使用外部模块(以下简称为
依赖项
),您需要做额外的工作。实现这一点有多种方法,每种方法都有各自的优缺点

以下列出了实现这一目标的各种方法;所有这些都需要对模块在Python中的工作方式有一点了解,以便了解发生了什么。总的来说,除了涉及到的路径之外,没有任何关于作用机制的“崇高文本”

注:以下内容截至回答时准确无误。然而,包控制计划改变它与即将到来的依赖项的工作方式,这些依赖项可能会改变这方面的某些方面

这与即将发布的Sublime版本有关,它支持当前包控制机制不支持的多个Python版本(以及它支持这些版本的方式)

目前还不清楚这一变化是否会带来一种新的方式来指定依赖项,或者是否只有依赖项安装方式的内部工作方式会发生变化。然而,现有的机制可能仍然存在,不管是否只是为了向后兼容

从Sublime插件访问Python
依赖关系的所有方法都涉及将其代码放在Python解释器将要查找它的地方。这类似于标准Python的工作方式,只是选中的位置包含在Sublime用于存储配置的区域(称为
数据
目录)中,Python不是独立的Python解释器,而是在插件主机中运行

将库填充到
Lib
文件夹中 自版本3.0(build 3143)以来,Sublime将在数据目录中创建一个名为
Lib
的文件夹,并在其中创建一个基于Python版本名称的目录。如果您使用
首选项>浏览软件包
并升级一个文件夹级别,您将看到
,其中有一个名为
python3.3
(或者如果您使用的是较新版本,
python33
python38

默认情况下,这些目录直接位于Python
sys.path
上,因此任何插件都可以立即使用其中的任何内容,就像普通Python库(或任何内置的)一样。您可以将这些文件夹视为类似于标准Python中的<代码>站点包< /代码>文件夹。

因此,可以使用任何可以安装标准Python库的方法,只要结果是文件最终位于该文件夹中。例如,您可以通过
pip
安装库,然后从
site packages
手动将文件复制到该位置,从源代码手动安装,等等

Lib/python3.3/
|-- librarya
|   `-- file1.py
|-- libraryb
|   `-- file2.py
`-- singlefile.py
此处适用版本限制;要使用的
依赖项
必须支持Sublime正在使用的Python版本,否则它将无法工作。这对于带有本机组件(例如
.dll
.so
.dylib
)的Python库尤其重要,因为它们可能需要手动编译代码

这种方法不是自动的;您需要这样做才能在本地使用您的包,任何想要使用您的包的人也需要这样做。由于Sublime目前使用的是较旧版本的Python,因此获得正确版本的库也可能会有问题

将来,Package Control将在该位置安装
依赖项
(将在3.0版运行期间添加专门用于此目的的文件夹),但在我编写此答案时,目前情况并非如此

直接在您自己的包中提供依赖项 默认情况下,
Packages
文件夹也位于
sys.path
上;这就是Sublime查找和加载包的方式。物理
文件夹和包含
升华包
文件内容的“虚拟”包文件夹都是如此

例如,可以通过以下方式访问提供
exec
命令的类:

from Default.exec import exec命令
即使
exec.py
文件实际存储在sublime text install文件夹中的
Default.sublime软件包
中,并且在
Packages
文件夹中没有实际存在,这也会起作用

因此,您可以在自己的软件包中直接使用所需的
供应商
任何
依赖项
。这里可以是
用户
包或您正在创建的任何其他包

需要注意的是,Sublime会将包的顶层中的任何
Python
文件视为插件,并尝试将其作为插件加载。因此,重要的是,如果你走这条路,你会创建一个
MyPackage/
|-- alibrary
|   `-- code.py
`-- my_plugin.py
Packages/my_dependency/
├── .sublime-dependency
└── prefix
    └── my_dependency
        └── file.py