Sublime使用自己的嵌入式Python解释器(目前是Python 3.3.6,不过下一个版本也将支持Python 3.8),因此它将完全忽略系统上可能安装或可能未安装的任何Python版本,以及为该版本安装的任何库。
因此,如果您想使用外部模块(以下简称
dependencies
)你需要做额外的工作。实现这一点有多种方法,每种方法都有各自的优缺点。
下面列出了实现这一目标的各种方法;所有这些都需要对Python中的模块如何工作有一点了解,才能理解发生了什么。总的来说,除了涉及的路径之外,没有任何关于机制的“崇高文本”。
注:
以下内容截至回答时准确无误。然而,包控制计划改变它与即将到来的依赖项的工作方式,这些依赖项可能会改变这一点的某些方面。
这与即将发布的Sublime版本有关,该版本支持多个Python版本(以及它支持这些版本的方式),而当前的包控制机制不支持这些版本。
目前尚不清楚这一变化是否会带来一种新的方式来指定依赖项,或者是否只有依赖项安装方式的内部工作方式会发生变化。然而,现有的机制可能仍然存在,不管是否只是为了向后兼容。
通往Python的所有道路
dependency
Data
目录),而不是一个独立的Python解释器,Python正在插件主机中运行。
将库填充到
Lib
文件夹
自3.0版(build 3143)以来,Sublime将创建一个名为
解放党
在数据目录中,以及其中一个基于Python版本名称的目录。如果你使用
Preferences > Browse Packages
再往上一层,你会看到
解放党
,其中有一个名为。
python3.3
(或者如果您使用的是较新的版本,
python33
和
python38
).
这些目录直接位于Python上
sys.path
默认情况下,任何插件都可以立即使用其中的任何内容,就像普通Python库(或任何内置的Python库)一样。你可以认为这些文件夹类似于
site-packages
标准Python中的文件夹。
因此,任何可以安装标准Python库的方法都可以使用,只要结果是文件最终出现在这个文件夹中。例如,您可以通过安装一个库
pip
然后手动将文件从
网站包
,从源代码等手动安装。
Lib/python3.3/
|-- librarya
| `-- file1.py
|-- libraryb
| `-- file2.py
`-- singlefile.py
附属国
您想要使用的版本必须支持Sublime正在使用的Python版本,否则它将无法工作。这对于带有本机组件(例如
.dll
,
.so
或
.dylib
),这可能需要手动编译代码。
这种方法不是自动的;您需要这样做才能在本地使用您的包,任何想要使用您的包的人也需要这样做。由于Sublime目前使用的是较旧版本的Python,因此获得正确版本的库也可能会有问题。
将来,将安装Package Control
依赖关系
在这个位置(将在3.0版运行期间添加专门用于此目的的文件夹),但截至我撰写此答案时,目前情况并非如此。
直接在自己的包中提供依赖项
这个
Packages
系统。路径
默认情况下也是如此;这就是Sublime查找和加载包的方式。这是真实的两个物理
包装
文件夹,以及包含
sublime-package
文件夹。
exec
命令通过:
from Default.exec import ExecCommand
即使
exec.py
文件实际上存储在
Default.sublime-package
包装
文件夹
因此,你可以
vendor
任何
依赖关系
直接放在你自己的包裹里。这里可能是
User
重要的是要注意,升华将治疗任何
Python
将文件作为插件保存在包的顶层,并尝试将其作为插件加载。因此,如果你走这条路,在你的包中创建一个子文件夹并把库放进去是很重要的。
MyPackage/
|-- alibrary
| `-- code.py
`-- my_plugin.py
通过这种结构,您可以直接访问模块:
import MyPackage.alibrary
from MyPackage.alibrary import someSymbol
并非所有Python模块都可以不经修改直接使用这种方法;中的一些代码更改
附属国
可能需要,以便允许库的不同部分看到自身的其他部分,例如,如果不使用相对
import
获取兄弟姐妹文件。根据您使用的库的不同,许可证限制也可能会妨碍这一点。
另一方面,这会直接将您正在使用的库的版本锁定到您测试的版本,从而确保您不会再遇到任何不必要的意外。
使用这种方法,您分发包所做的任何事情都会自动分发包中包含的供应商库。所以,如果您是通过包控制进行分发的,那么您不需要做任何特殊的事情,它只会起作用。
修改
系统。路径
指向自定义位置的步骤
嵌入到Sublime中的Python仍然是标准Python,因此如果需要,可以手动操作
系统。路径
这说明了要在哪些文件夹中查找包,以便在升华自动设置的标准位置之外,还可以在您选择的位置查找包。
这通常不是一个好主意,因为如果做得不正确,事情很快就会变成梨形。它还要求您首先手动在某个地方安装库,在这种情况下,最好使用
解放党
文件夹,已在
系统。路径
.
我认为这种方法是一种先进的解决方案,一种在开发过程中可能用于测试的目的,但否则不会是用户所面临的问题。如果您计划通过包控制分发包,那么对包的审查可能会回击对包的操纵
系统。路径
请求使用另一种方法。
使用包控件的依赖关系系统(并且依赖关系存在)
包控件包含
dependency mechanism
它使用前面两种方法的组合来提供一种自动安装依赖项的方法。有一个
list of available dependencies
当然,这个列表可能并不完整。
如果
附属国
你感兴趣的东西已经准备好了,你可以走了。有两种不同的方式来声明您的包需要一个或多个依赖项。
笔记
第一个涉及添加
依赖关系
程序包控制通道文件中程序包条目的键。这是在将包添加到包控制时要采取的步骤,这超出了本答案的范围。
在开发包的过程中(或者如果完成后决定不想通过包控制分发包),可以添加
dependencies.json
文件放入包的根目录中(一个
example dependencies.json
文件可用于说明这一点)。
一旦你这么做了,你可以选择
Package Control: Satisfy Dependencies
从命令调色板下载软件包控件,并为您安装依赖项(如果需要)。
如果软件包由软件包控制分发和安装,则此步骤是自动的;否则,在用户安装软件包后,您需要告诉他们执行此步骤。
使用包控件的依赖关系系统(但依赖关系不存在)
Package Control用于安装的方法
依赖关系
正如问题顶部所述,在未来(可能在不久的将来)可能会发生变化。这可能会影响此处的说明。就设置而言,整体机制可能保持不变,只是安装位置发生了变化,但目前仍有待观察。
Package Control通过以下特殊组合安装依赖项:
vendoring
还有操纵
系统。路径
让东西被发现。为了做到这一点,它要求您以特定的方式布置您的依赖关系,并提供一些额外的元数据。
构建包含依赖项的包时,其布局的结构类似于以下内容:
Packages/my_dependency/
âââ .sublime-dependency
âââ prefix
âââ my_dependency
âââ file.py
包控件安装一个
附属国
作为一个包,由于升华将包根中的每个Python文件都视为一个插件,因此依赖项的代码并不保留在包的顶层。如上所述,依赖项的实际内容存储在标记为
prefix
上图(稍后将详细介绍)。
安装依赖项后,包控件会向其特殊
0_package_control_loader
导致
前缀
要添加到文件夹的文件夹
系统。路径
,使其内部的所有内容都可供用户使用
进口
声明正常。这就是为什么图书馆的名字与生俱来的重复(
my_dependency
在本例中)。
关于
前缀
文件夹,它实际上并没有命名为that,而是有一个特殊的名称,它决定了依赖项在什么样的崇高文本版本、平台和体系结构组合上可用(例如,对于包含二进制文件的库很重要)。
那个人的名字
前缀
文件夹实际上遵循以下格式
{st_version}_{os}_{arch}
,
{st_version}_{os}
,
{st_version}
或
all
.
{st_版本}
可以是
st2
或
st3
,
{os}
可以是
windows
,
linux
或
osx
和
{arch}
可以是
x32
或
x64
.
因此,你可以说你的依赖关系只支持
st3
,
st3_linux
,
st3_windows_x64
或其任何组合。对于使用本机代码的东西,您可以通过拥有多个文件夹来指定多个不同的版本,尽管通常是这样
全部的
当
包含纯Python代码,无论其版本、操作系统或体系结构如何,都能正常工作。
在这个例子中,如果我们假设
前缀
文件夹名为
全部的
因为
我的依赖
如果是纯Python,那么安装此依赖项的结果将是
Packages/my_dependency/all
将被添加到
系统。路径
,意思是如果你
import my_dependency
你从文件夹里得到了代码。
在开发过程中(或者如果不想通过包控制来分发依赖项),可以创建
.sublime-dependency
文件位于包的根目录中,如上所示。这应该是一个文本文件,其中一行包含一个2位数的数字(例如。
01
或
50
)。此选项控制每个已安装的依赖项将以何种顺序添加到
系统。路径
.如果你的依赖项没有其他依赖项,你通常会选择一个较低的数字,如果它有其他依赖项,你会选择一个较高的值(这样它就会在这些依赖项之后被注入)。
一旦以正确的格式在
包装
文件夹,您可以使用以下命令
Package Control: Install Local Dependency
从命令选项板中,然后选择依赖项的名称。
这会导致包控制“安装”依赖项(即更新
0_包_控制_加载器
包)使依赖项处于活动状态。当Package Control第一次安装依赖项时,通常会自动执行此步骤,因此如果您也要手动分发依赖项,则需要提供执行此步骤的说明。