当前位置: 首页 > 知识库问答 >
问题:

Sublime Text插件开发中的全局Python包

温嘉赐
2023-03-14

我没有找到,如何Sublime文本插件开发人员可以使用Sublime文本找到全局Python包,而不是Python包的Sublime文本目录。

Sublime文本使用自己的Python环境,而不是机器的Python环境。开发人员需要sys.path来设置not内置的Sublime Text Python包。

是否有任何方法,使用全局安装的Python包在Sublime的文本插件?例如,如果有人告诉我,我可以如何改变我的插件,这将是很好的-参见本题3.2项。

  1. Sublime Text 3 Build 3126使用Python 3.3,但在写这个问题的时候发布了Python 3.6稳定版。Python 3.6具有更多功能。
  2. 开发人员需要添加和更新第三方Python包,即使它们是为用户安装的。它花了开发人员一段时间。
  3. 对于开发人员,包的相关性可能存在问题,请参阅本问题的6.2项。

例如,我编写了Python代码--将替换为[**][**][**](https://github.com/kristinita/kristinita.github.io),其中https://github.com/kristinita/kristinita.github.io-DuckDuckGo查询的第一个链接

# -*- coding: utf-8 -*-
import re
import urllib

from bs4 import BeautifulSoup

from w3lib.url import safe_url_string


# ASCII link for solved encoding problems —
# https://stackoverflow.com/a/40654295/5951529
ascii_link = safe_url_string(
    u'http://duckduckgo.com/html/?q=' + 'Поиск Кристиниты',
    encoding="UTF-8")
print(ascii_link)
# SERP DuckDuckGo
serp = urllib.request.urlopen(ascii_link)
# Reading SERP
read_serp = serp.read()
# BeautifulSoup — https://stackoverflow.com/a/11923803/5951529
parsed = BeautifulSoup(read_serp, "lxml")
# Parsed first link
first_link = parsed.findAll(
    'div', {'class': re.compile('links_main*')})[0].a['href']
# Remove DuckDuckGo specific characters —
# https://stackoverflow.com/a/3942100/5951529
remove_duckduckgo_symbols = first_link.replace("/l/?kh=-1&uddg=", "")
# https://stackoverflow.com/a/32451970/5951529
final_link = (urllib.parse.unquote(remove_duckduckgo_symbols))
# Markdown link
markdown_link = '[' + 'Поиск Кристиниты' + ']' + \
    '(' + final_link + ')'

print(markdown_link)

如果我在terminal或SublimeREPL中运行这个文件,我会得到输出:

[**Поиск Кристиниты**](https://github.com/Kristinita/Kristinita.github.io/)

现在,基于此代码,我编写了Sublime Text插件,用于将示例文本替换为[**示例文本**](http:// ) :

import re
import urllib

from bs4 import BeautifulSoup

from w3lib.url import safe_url_string

import sublime_plugin


class KristinitaLuckyLinkCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        # Get selection text
        print('KristinitaLuckyLink called')
        select = self.view.sel()
        selection_region = select[0]
        selection_text = self.view.substr(selection_region)
        print(selection_text)

        # ASCII link for solved encoding problems —
        # https://stackoverflow.com/a/40654295/5951529
        ascii_link = safe_url_string(
            u'http://duckduckgo.com/html/?q=' + (selection_text),
            encoding="UTF-8")
        print(ascii_link)
        # SERP DuckDuckGo
        serp = urllib.request.urlopen(ascii_link)
        # Reading SERP
        read_serp = serp.read()
        # BeautifulSoup — https://stackoverflow.com/a/11923803/5951529
        parsed = BeautifulSoup(read_serp, "lxml")
        # Parsed first link
        first_link = parsed.findAll(
            'div', {'class': re.compile('links_main*')})[0].a['href']
        # Remove DuckDuckGo specific characters —
        # https://stackoverflow.com/a/3942100/5951529
        remove_duckduckgo_symbols = first_link.replace("/l/?kh=-1&uddg=", "")
        # Final link — https://stackoverflow.com/a/32451970/5951529
        final_link = (urllib.parse.unquote(remove_duckduckgo_symbols))
        markdown_link = '[' + selection_text + ']' + \
            '(' + final_link + ')'
        print(markdown_link)

        # Replace selected text to Markdown link
        self.view.replace(
            edit, selection_region, markdown_link)

如果用户已经安装了Python并安装了软件包

  • PIP安装BeautifulSoup4
  • PIP安装lxml
  • PIP安装W3lib

我想,我的插件从2.2项成功为用户工作。

如果我保存了我的插件,我会得到堆栈跟踪:

Traceback (most recent call last):
  File "D:\Sublime Text Build 3126 x64 For Debug\sublime_plugin.py", line 109, in reload_plugin
    m = importlib.import_module(modulename)
  File "./python3.3/importlib/__init__.py", line 90, in import_module
  File "<frozen importlib._bootstrap>", line 1584, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 584, in _check_name_wrapper
  File "<frozen importlib._bootstrap>", line 1022, in load_module
  File "<frozen importlib._bootstrap>", line 1003, in load_module
  File "<frozen importlib._bootstrap>", line 560, in module_for_loader_wrapper
  File "<frozen importlib._bootstrap>", line 868, in _load_module
  File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
  File "D:\Sublime Text Build 3126 x64 For Debug\Data\Packages\Grace Splitter\kristi.py", line 4, in <module>
    from bs4 import BeautifulSoup
ImportError: No module named 'bs4'
  • 如何在Sublime Text 2插件中包含第三方Python包,
  • 在ST2插件中使用paramiko库,
  • 插件的最佳实践-部署和打包,
  • 如何导入包并调用其全局函数/以获取其全局html" target="_blank">变量值?

I安装

  • Sublime-美丽4,
  • Sublime-lxml,

我在Sublime Text 3控制台中运行:

>>> window.run_command("kristinita_lucky_link")

我得到堆栈跟踪:

Traceback (most recent call last):
  File "D:\Sublime Text 3 x64\sublime_plugin.py", line 818, in run_
    return self.run(edit)
  File "D:\Sublime Text 3 x64\Data\Packages\KristinitaLuckyLink\KristinitaLuckyLink.py", line 32, in run
    parsed = BeautifulSoup(read_serp, "lxml")
  File "D:\Sublime Text 3 x64\Data\Packages\bs4\__init__.py", line 165, in __init__
    % ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?

我没有找到,我如何可以设置lxml

例如,我在同一个目录中有kristinitaluckylink.pykrisduckduckgo.py文件。

我的kristinitaluckylink.py文件:

import re
import requests
import sublime_plugin
import subprocess
import sys
sys.path.append(
    'D:\Sublime Text 3 x64\Data\Packages\KristinitaLuckyLink\KrisDuckDuckGo.py')

from KrisDuckDuckGo import final_link
from bs4 import BeautifulSoup


class KristinitaLuckyLinkCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        # Get selection text
        print('KristinitaLuckyLink called')
        select = self.view.sel()
        selection_region = select[0]
        selection_text = self.view.substr(selection_region)
        print(selection_text)

        # Get terminal output — https://stackoverflow.com/a/4760517/5951529
        # Paths is correct
        result = subprocess.run(["C:\Python36\python.exe", "D:\Sublime Text 3 x64\Data\Packages\KristinitaLuckyLink\krisduckduckgo.py"],
                                stdout=subprocess.PIPE)
        final_link = result.stdout.decode('utf-8')
        print(final_link)

        # Markdown link
        markdown_link = '[' + selection_text + ']' + \
            '(' + final_link + ')'
        print(markdown_link)

        # Replace selected text to Markdown link
        self.view.replace(
            edit, selection_region, markdown_link)

我的krisduckduckgo.py文件:

import urllib

import sys
sys.path.append(
    'D:\Sublime Text 3 x64\Data\Packages\KristinitaLuckyLink\KristinitaLuckyLink.py')

from w3lib.url import safe_url_string

from KristinitaLuckyLink import selection_text

from bs4 import BeautifulSoup


# ASCII link for solved encoding problems —
# https://stackoverflow.com/a/40654295/5951529
ascii_link = safe_url_string(
    u'http://duckduckgo.com/html/?q=' + (selection_text),
    encoding="UTF-8")
print(ascii_link)
# SERP DuckDuckGo
serp = urllib.request.urlopen(ascii_link)
# Reading SERP
read_serp = serp.read()
# BeautifulSoup — https://stackoverflow.com/a/11923803/5951529
parsed = BeautifulSoup(read_serp, "lxml")
# Parsed first link
first_link = parsed.findAll(
    'div', {'class': re.compile('links_main*')})[0].a['href']
# Remove DuckDuckGo specific characters —
# https://stackoverflow.com/a/3942100/5951529
remove_duckduckgo_symbols = first_link.replace("/l/?kh=-1&uddg=", "")
# Final link — https://stackoverflow.com/a/32451970/5951529
final_link = (urllib.parse.unquote(remove_duckduckgo_symbols))
print(final_link)

我选择我在Sublime文本控制台中打印的任何文本:

window.run_command(“kristinita_lucky_link”)

我没有得到输出在Sublime文本控制台。


共有1个答案

郏博瀚
2023-03-14

错误:

bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?

很可能是因为Sublime Text发现lxml是作为全局Python环境的一部分安装的--该环境是为与ST使用的Python不同的Python版本编译的--所以无法加载它。

我们希望ST找到sublime-lxml依赖项,您在问题中链接到该依赖项。你可能会问:“为什么要找错人?”这很难说清楚,但我认为Odatnurd的回答给了我们一些线索--由于某种原因,ST看到的sys.path包括了您的所有全局Python包。默认情况下,ST应该只使用它的可执行文件所在的文件夹和ST data目录中的Packages文件夹。例如,在我的系统上,执行import sys;st的控制台中的sys.path给出:

[
 'C:\\Program Files\\Sublime Text 3',
 'C:\\Program Files\\Sublime Text 3/python3.3.zip',
 'C:\\Users\\Keith\\AppData\\Roaming\\Sublime Text 3\\Packages',
 'C:\\Users\\Keith\\AppData\\Roaming\\SUBLIM~1\\Packages\\lxml\\ST3_WI~2'
]

即没有site-packages文件夹。

因此,解决办法要么是:

a.您可以尝试卸载系统范围的lxml包,以便ST只找到sublime-lxml依赖包,但实际上这只是一个临时措施。最好是:B。调整ST正在使用的path环境变量(项的顺序)。(即删除对site-packages的所有引用,或至少移动它们,使它们位于ST文件夹之后。)

选项B不应该影响任何其他ST插件,因为它们也会遭受同样的问题。我怀疑是其他一些包改变了ST正在使用的路径,但如果不搜索它们,要找出是哪一个可能并不容易。当使用构建系统时,用于这些系统的路径与插件用于加载其模块的路径截然不同,因此构建系统也应该不受此“修复”的影响。

 类似资料:
  • 我正在开发一个詹金斯插件,我需要为詹金斯的所有工作提供一个新的环境变量。有点像Jenkins全局属性或环境变量,或者完全一样。我不确定。我只需要它对任何脚本都可用。 我已经在插件的文件的一个条目中捕获了这个环境变量的值,该文件是公开的,可以通过访问

  • FIS3 是以 File 对象为中心构建编译的,每一个 File 都要经历编译、打包、发布三个阶段。运行原理讲述了 FIS3 中的插件扩展点;那么本节就将说明一个插件如何开发; 如上图,编译起初,扫描项目目录下的所有文件(不包含指定排除文件),后实例化 File 对象,并对 File 内容进行编译分析; 编译阶段插件 在编译阶段,文件是单文件进行编译的,这个阶段主要是对文件内容的编译分析;这个阶段

  • 插件需要 export 一个函数,函数会接收到两个参数,第一个是 build-scripts 提供的 pluginAPI,第二个是用户传给插件的自定义参数,如下: module.exports = (pluginAPI, options) => { const { context, log, onHook } = pluginAPI; }; pluginAPI

  • 初始化插件 你可以通过 create-umi 直接创建一个 umi 插件的脚手架: $ yarn create umi --plugin 在 umi 中,插件实际上就是一个 JS 模块,你需要定义一个插件的初始化方法并默认导出。如下示例: export default (api, opts) => { // your plugin code here }; 需要注意的是,如果你的插件需要发

  • 插件开发 消费器插件 继承AbstractDataConsumer类 通过spring.factories发布: cn.vbill.middleware.porter.core.task.consumer.DataConsumer=xxx 通过配置文件生效: porter.task[index].consumer.consumerName=pluginName EventConverte

  • 运行开发服务器 npm install npm install -g ykit #依赖 ykit npm run dev #启动开发服务器 加载插件 在config.json plugins配置项,加入 demo 插件, { "port": "3000", "db": { "servername": "127.0.0.1", "DATABASE": "yapi" }