【问题标题】:Sublime Text 3 Creating Plugin adding external python librariesSublime Text 3 创建插件添加外部 python 库
【发布时间】:2017-11-25 06:50:55
【问题描述】:

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

我已经配置了 Context.sublime-menu 文件如下来创建上下文菜单选项:

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

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

但是,当我尝试在定义了“SlackSnippet”命令的 python 文件中导入机械汤模块时,我遇到了麻烦:

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 中创建插件的新手,我们将不胜感激!

【问题讨论】:

  • 您能否在此处提供更多详细信息,例如您尝试在包中导入的内容,或者您​​是否尝试让 Sublime 导入您为常规 python 安装的模块?
  • 两者。最初我的包中没有它,但后来我将它的整个目录复制到 Packages/myPackage 中。

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


【解决方案1】:

在第二种情况下您的命令显示为灰色的原因是因为 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 文件夹存储在同一位置;使用该命令并上一层文件夹)

您可以选择将您的模块(例如 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

【讨论】:

  • 顺便说一句,我只想说这可能是我在 SO 上收到的最清晰、信息最丰富的答案。
  • 很高兴您发现它有帮助!
  • 解释得很漂亮。不知道为什么这个答案没有被接受。
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多