Python 3.x 升华文本3创建插件添加外部python库

Python 3.x 升华文本3创建插件添加外部python库,python-3.x,sublimetext3,sublime-text-plugin,Python 3.x,Sublimetext3,Sublime Text Plugin,所以我尝试创建一个插件,并使用上下文菜单执行它。在我的插件中,我想使用mechanical soup模块 我已按如下方式配置Context.sublime-menu文件以创建上下文菜单选项: [ { "id": "SlackSnippets", "caption": "SlackSnippets", "children": [ {"id": "wrap"}, { "command": "slacksnippet" } ] }

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

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

[
{
    "id": "SlackSnippets",
    "caption": "SlackSnippets",
    "children":
    [
        {"id": "wrap"},
        { "command": "slacksnippet" }
    ]
}
]
现在,上下文菜单的极端基本功能开始发挥作用,当您右键单击时,它会显示出来,并且它的子命令是可单击的:

但是,我遇到的问题是,我尝试在定义了“SlackSnippet”命令的python文件中导入mechanical soup模块:

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
关联菜单中的命令随后变灰,我无法使用它:


我是新创建的插件在升华文本3和任何帮助与此将不胜感激

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

如果使用Ctrl+`或
View>Show console
打开Sublime控制台,您将看到一个堆栈跟踪:

ImportError:没有名为'mechanicalsoup'的模块
首先要注意的是,Sublime文本包含它自己的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源文件(因为它认为它是一个包)这不是你想要的,除了在简单的情况下,它可能实际上不起作用

    升华会忽略任何不在包文件夹顶层的Python文件,除非您明确告诉它加载它(即通过
    import
    )。因此,您可以将模块直接放在包文件夹中,然后从那里导入它们

    例如,如果您的包名为
    SlackSnippets
    ,则您的包文件夹可能如下所示:

    SlackSnippets/
    |--机械组
    ||--uuu init_uuuuuuuuuuuuuuuuuy.py
    ||--uuu版本_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    ||--browser.py
    ||--form.py
    ||--stateful_browser.py
    |`--utils.py
    `--slack_snippet_cmd.py
    
    现在,您可以通过指定模块名称来导入模块。mechanicalsoup:

    from\uuuuu future\uuuuu导入打印功能
    导入操作系统
    导入SlackSnippets.mechanicalsoup
    进口升华
    导入升华插件
    类SlacksnippetCommand(升华插件.TextCommand):
    def运行(自我,编辑):
    通过
    
    注意:此模块仍然无法工作,因为此模块需要安装其他模块,例如
    请求
    。但是,我不确定特定的兔子洞有多深,因为我不使用此模块。)

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

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

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

    不过,您(和您的用户)仍然有责任将模块放在那里;Sublime不会单独为您做这类事情。如果您计划在完成后使用Package Control分发包,您可以从中获得一点喘息的机会

    软件包控制支持在安装软件包时为用户安装模块(如果尚未安装)的概念,并通过一些设置

    目前,这是由软件包控制来处理的,方法是将模块放入带有特殊软件包布局的
    Packages
    文件夹,然后在后台进行一些工作,以便升华将其视为常规模块

    为了实现这一点,您需要将所需的依赖项也存储在Package Control中,如果您感兴趣的模块还不可用,则需要您进行更多的设置工作


    目前,
    mechanicalsoup
    不可用,尽管
    请求
    可用。可用依赖项列表为。

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

    如果用Ctr打开Sublime控制台