Sublime Text 3创建插件添加外部python库

时间:2017-11-25 06:50:55

标签: python-3.x sublimetext3 sublime-text-plugin

所以我正在尝试创建一个插件并使用上下文菜单执行它。在我的插件中,我想使用机械汤模块。

我已按如下方式配置Context.sublime-menu文件以创建上下文菜单选项:

[
{
    "id": "SlackSnippets",
    "caption": "SlackSnippets",
    "children":
    [
        {"id": "wrap"},
        { "command": "slacksnippet" }
    ]
}
]

现在,通过这个,上下文菜单的极端基本功能可以工作,当你右键单击它时会显示它,并且它的子命令是可点击的: Clickable Content

然而,当我遇到麻烦的时候,我尝试在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

然后,上下文菜单中的命令变灰,我无法使用它: enter image description here

我是Sublime Text 3中创建插件的新手,非常感谢任何帮助!

1 个答案:

答案 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文件/模块,但是唯一用于与用户交互的文件/模块是:

  1. Sublime Text Packages文件夹,您可以从菜单中选择Preferences > Browse Packages
  2. 名为Lib/python3.3的文件夹(LibPackages文件夹存放在同一位置;使用该命令并上传一个文件夹级别)
  3. 您可以选择将模块(例如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