在第二种情况下您的命令显示为灰色的原因是因为 Sublime 无法使用您提到的行加载插件,因此它不知道菜单项告诉它执行的命令,因此它被禁用(如果您使用的是命令调色板,则在这种情况下该命令根本不会出现)。
如果你使用 Ctrl+` 或 View > Show Console 打开 Sublime 控制台,你会看到一个堆栈跟踪:
ImportError: No module named 'mechanicalsoup'
首先要注意的是,Sublime Text 包含它自己的嵌入式 Python 3.3.6 版本,它与您可能安装在计算机上的任何 Python 版本完全不同。
因此默认情况下它无法加载系统安装的 Python 模块,因为它对它们一无所知。可以让 Sublime 查看系统位置,但这通常不是一个好主意,因为它引入了许多外部依赖项,您的插件/包的用户需要在您的代码工作之前安装这些依赖项(包括安装 Python 3.3.6 本身)。
一般来说,嵌入在 Sublime 中的 Python 解释器会在几个位置查找 Python 文件/模块,但供用户交互的唯一位置是:
- Sublime Text
Packages 文件夹,您可以通过从菜单中选择 Preferences > Browse Packages 来访问该文件夹
- 一个名为
Lib/python3.3 的文件夹(Lib 与 Packages 文件夹存储在同一位置;使用该命令并上一层文件夹)
您可以选择将您的模块(例如 mechanicalsoup 放在 Packages 文件夹中。但是,这不是一个特别好的主意,因为 Sublime 会尝试自动加载顶级 Python 源文件(因为它认为是一个包),这不是您想要的,除非在简单的情况下,否则可能无法实际工作。
Sublime 会忽略任何不在包文件夹顶层的 Python 文件,除非你明确告诉它加载它(即通过import)。所以你可以将你的模块直接放在你的包文件夹中并从那里导入它们。
例如,如果您的包名为 SlackSnippets,您的包文件夹可能如下所示:
SlackSnippets/
|-- mechanicalsoup
| |-- __init__.py
| |-- __version__.py
| |-- browser.py
| |-- form.py
| |-- stateful_browser.py
| `-- utils.py
`-- slack_snippet_cmd.py
现在你可以通过指定模块名称SlackSnippets.mechanicalsoup来导入模块:
from __future__ import print_function
import os
import SlackSnippets.mechanicalsoup
import sublime
import sublime_plugin
class SlacksnippetCommand(sublime_plugin.TextCommand):
def run(self, edit):
pass
(注意:这仍然不起作用,因为此模块需要安装其他模块,例如requests。但是我不确定那个特定的兔子洞有多深,因为我不使用这个模块。)
根据所讨论的模块及其编写方式,使事情以这种方式工作可能涉及更多工作,例如是否需要特定于操作系统的库。
这给我们留下了上面提到的第二个选项,即将你的模块放在Lib/python3.3 文件夹中,这样 Sublime 就可以找到它们。
在这种情况下,由于该文件夹位于搜索路径中,因此您最初发布的代码将加载模块而不进行任何更改(尽管由于没有可用的 requests 模块,它仍然无法在此处工作)。
不过,您(和您的用户)仍然有责任将模块放在那里; Sublime 不会自己为你做那种事情。如果您计划在完成后使用 Package Control 分发您的包,您可以从中获得一点喘息的机会。
Package Control 支持dependency modules 的概念,并且通过一些设置会在安装包时为用户安装模块(如果尚未安装)。
目前这是由 Package Control 处理的,方法是将模块放入具有特殊包布局的 Packages 文件夹,然后在幕后进行一些工作,以便 Sublime 将其视为常规模块。
为了使其工作,您需要将所需的依赖项也存储在 Package Control 中,如果您感兴趣的模块尚不可用,则需要您进行更多设置工作。
目前mechanicalsoup 不可用,尽管requests 可用。可用依赖项列表是here。