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

Sta*_*ama 1 python-3.x sublimetext3 sublime-text-plugin

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

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

[
{
    "id": "SlackSnippets",
    "caption": "SlackSnippets",
    "children":
    [
        {"id": "wrap"},
        { "command": "slacksnippet" }
    ]
}
]
Run Code Online (Sandbox Code Playgroud)

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

但是,当我遇到麻烦的时候,然后我尝试在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
Run Code Online (Sandbox Code Playgroud)

然后,上下文菜单中的命令将灰显,我无法使用它: 在此输入图像描述

我是Sublime Text 3中创建插件的新手,对此有任何帮助将不胜感激!

Oda*_*urd 7

你的命令在第二种情况下变灰的原因是因为Sublime无法使用你提到的行加载插件,因此它不知道菜单条目告诉它执行的命令,所以它被禁用(如果您使用的是命令选项板,则在这种情况下该命令根本不会出现).

如果您打开Sublime控制台,Ctrl+`或者View > Show Console您将看到堆栈跟踪说明:

ImportError: No module named 'mechanicalsoup'
Run Code Online (Sandbox Code Playgroud)

首先要注意的是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(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
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过指定模块名称来导入模块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
Run Code Online (Sandbox Code Playgroud)

(注意:这仍然无法工作,因为这个模块需要安装其他模块,例如requests.我不确定特定的兔子洞有多深,因为我不使用这个模块.)

根据所讨论的模块及其编写方式,可能会有更多的工作涉及以这种方式工作,例如是否需要操作系统特定的库.

这给我们留下了上面提到的第二个选项,即将模块放在Lib/python3.3文件夹中,以便Sublime能够找到它们.

在这种情况下,由于该文件夹位于搜索路径中,因此您最初发布的代码将加载模块而不进行任何更改(尽管由于没有requests可用的模块,它仍然无法在此处工作).

但是,您(和您的用户)仍然负责将模块放在那里; Sublime不会为你自己做那种事情.如果您计划在完成后使用Package Control分发您的包裹,您可以从中获得一点喘息的机会.

Package Control支持依赖模块的概念,并且一些设置将在安装软件包时为用户安装模块(如果它们尚未安装).

目前,这是由Package Control处理的,方法是将模块放入Packages具有特殊包布局的文件夹中,然后在后台进行一些工作,以便Sublime将其视为常规模块.

为了使其工作,您需要将所需的依赖项也存储在Package Control中,如果您感兴趣的模块尚不可用,则需要您进行更多的设置工作.

目前mechanicalsoup不可用,虽然requests是.可用依赖项列表在此处.