所以我正在尝试创建一个插件并使用上下文菜单执行它。在我的插件中,我想使用机械汤模块。
我已按如下方式配置Context.sublime-menu文件以创建上下文菜单选项:
[
{
"id": "SlackSnippets",
"caption": "SlackSnippets",
"children":
[
{"id": "wrap"},
{ "command": "slacksnippet" }
]
}
]
现在,通过这个,上下文菜单的极端基本功能可以工作,当你右键单击它时会显示它,并且它的子命令是可点击的:
然而,当我遇到麻烦的时候,我尝试在python文件中导入机械汤模块,其中定义了'SlackSnippet'命令:
from __future__ import print_function
import os
import mechanicalsoup """If Commented out, I can click the command in the context window"""
import sublime
import sublime_plugin
class SlacksnippetCommand(sublime_plugin.TextCommand):
def run(self, edit):
## Code
我是Sublime Text 3中创建插件的新手,非常感谢任何帮助!
答案 0 :(得分:6)
在第二种情况下你的命令显示为灰色的原因是因为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文件/模块,但是唯一用于与用户交互的文件/模块是:
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
模块可用,它仍然无法在此处工作)。 / p>
你(和你的用户)仍然负责将模块放在那里; Sublime并没有为你做这件事。如果您计划在完成后使用Package Control分发您的包裹,您可以从中获得一点喘息的机会。
Package Control支持dependency modules的概念,并且在安装软件包时,某些设置将为用户安装模块(如果它们尚未安装)。
目前,这是由Package Control处理的,方法是将模块放入具有特殊包布局的Packages
文件夹中,然后在幕后进行一些工作,以便Sublime将其视为常规模块。
为了使其工作,您需要将所需的依赖项也存储在Package Control中,如果您感兴趣的模块不是,那么需要您进行更多的设置工作。已经可以。
目前mechanicalsoup
不可用,但requests
是。{1}}。可用依赖项列表为here。