错误:
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环境的一部分安装 - 它是为不同版本的Python编译而不是ST使用的 - 所以它无法加载它。
lxml
我们想要的是ST找到的 sublime-lxml 您在问题中链接的依赖项。 “你为什么找错了?”,你可能会问。我很难肯定地说,但我想 OdatNurd的回答给了我们一些线索 - sys.path ST出于某种原因看到了包括所有全局Python包。默认情况下,ST应该只使用其可执行文件所在的文件夹和ST数据目录中的Packages文件夹。例如,在我的系统上执行 import sys; sys.path 在ST的控制台给我:
sublime-lxml
sys.path
import sys; 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 夹。
site-packages
因此解决方案是:
一个。您可以尝试卸载系统范围 lxml 包装让ST只会找到 sublime-lxml 依赖包,但实际上这只是一个临时措施。最好是: 湾调整ST正在使用的路径环境变量(项目的顺序)。 (即删除所有引用 site-packages ,或者至少移动它们以便它们位于ST文件夹之后。)
选项B不应该影响任何其他ST插件,因为它们也会遇到同样的问题。我怀疑其他一些软件包改变了ST正在使用的路径,但是可能不容易找出哪一个,而不是全部搜索它们。使用构建系统时,用于那些的路径与插件用于加载其模块的路径完全不同,因此构建系统也应该不受此“修复”的影响。
的 对于 强> 2018年开始:
的 您在插件中使用的所有全局模块都必须与Python 3.3兼容。 强>
例如,我添加到 Default.sublime-package 档案文件 0000.py 。来自的模块 Default.sublime-package 是 的 首先加载 强> 通过Sublime Text开始。
Default.sublime-package
0000.py
0000.py 内容:
import sys sys.path.append('C:\\Python36') sys.path.append('C:\\Python36\\python36.zip') sys.path.append('C:\\Python36\\DLLs') sys.path.append('C:\\Python36\\lib') sys.path.append('C:\\Python36\\lib\\site-packages')
路径是我的全球 sys.path 。
>>> import sys; sys.path ['', 'C:\\Python36', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36\\lib\\site-packages']
我重新启动SublimeText鈫鈫我在控制台中看到:
DPI scale: 1 startup, version: 3143 windows x64 channel: stable executable: /D/Sublime Text Build 3143 x64 For Debug/sublime_text.exe working dir: /D/Kristinita packages path: /D/Sublime Text Build 3143 x64 For Debug/Data/Packages state path: /D/Sublime Text Build 3143 x64 For Debug/Data/Local zip path: /D/Sublime Text Build 3143 x64 For Debug/Packages zip path: /D/Sublime Text Build 3143 x64 For Debug/Data/Installed Packages ignored_packages: ["Anaconda", "Vintage"] pre session restore time: 0.458819 startup time: 0.493818 first paint time: 0.506818 reloading plugin Default.0000 reloading plugin Default.auto_indent_tag reloading plugin Default.block # And so on
>>> import sys; sys.path ['D:\\Sublime Text Build 3143 x64 For Debug', 'D:\\Sublime Text Build 3143 x64 For Debug\\python3.3.zip', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Lib\\python3.3', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Packages', 'C:\\Python36', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36\\lib\\site-packages']
来自内部环境的路径在前方,即全球环境中的路径。我不知道,我怎么能改变它。
例如,我想在我的插件中使用 的 Python Google Search API 强> PyPI模块。它与Python 3.6兼容,但是 的 与Python 3.3不兼容 强> 。
我注入文件 0000.py 如上面的小节鈫鈫我创建插件 SashaGSearch.py ,它的内容:
SashaGSearch.py
import sublime_plugin from gsearch.googlesearch import search class GoogleSearchCommand(sublime_plugin.TextCommand): def run(self, edit): results = search('kristinitaluckylife', num_results=1) r = results[0][1] print(r)
我重启Sublime Text鈫 我得到了 的 同样的追溯 强> 好像 0000.py 没有实施。
请参阅Sublime Text论坛讨论:
我希望,在内部Sublime Text环境中,Python 3.3将在最近的将来被替换为3.6或下一个3.7版本。
如果您知道,那可能不添加新的环境变量,请回答 的 这个问题 强> 。
您需要在PC上创建环境变量,其中值为“路径” site-packages 夹。例如,我命名了它 PYTHONPACKAGES :
PYTHONPACKAGES
您需要添加到代码行中,如下所示 的 OdatNurd回答 强> :
# PYTHONPACKAGES path: # https://stackoverflow.com/a/4907053/5951529 # Disable duplicate paths: # https://stackoverflow.com/a/42656754/5951529 site_packages = (os.environ['PYTHONPACKAGES']) if site_packages not in sys.path: sys.path.append(site_packages)
插件的用户还必须添加环境变量 PYTHONPACKAGES 在操作系统中。在您的包的描述中,您需要添加说明,如何做。
的 对于 强> 开发过程:
的 如果更改文件,则可能需要重新启动Sublime Text site-packages 文件夹或子文件夹。 强>
你安装 examplesashamodule 从点子鈫 你开始Sublime Text鈫 你导入 examplesashamodule 你的插件鈫鈫你删除 examplesashamodule 从 site-packages 文件夹鈫鈫插件将作为 examplesashamodule 还在 site-packages 夹。 的 AutomaticPackageReloader 强> 在这种情况下,包没有帮助。
examplesashamodule
你重新启动Sublime Text鈫 你在Sublime Text控制台得到回溯,那 ImportError: No module named 'examplesashamodule' 。
ImportError: No module named 'examplesashamodule'
显然,Sublime Text会话来自会话中外部模块的数据。
Python从它知道的位置加载模块 sys.path ,以及Sublime Text 3 sys.path 仅指向几个位置(例如,Sublime可执行文件附带的软件包的位置,当前用户的用户安装软件包的位置等)。
要从Sublime文本插件中访问全局安装的Python模块,您需要显式添加其位置 sys.path 来自你的插件。
假设安装了python软件包的Linux机器 /usr/local/lib/python3.4/site-packages (将其修改为Windows机器的适当路径),其示例如下:
/usr/local/lib/python3.4/site-packages
import sublime import sublime_plugin import sys site_path="/usr/local/lib/python3.4/site-packages" if site_path not in sys.path: sys.path.append(site_path) from bs4 import BeautifulSoup class ExampleCommand(sublime_plugin.TextCommand): def run(self, edit): parser = BeautifulSoup('<a href="#">Link Text</a>', "html.parser") a = parser.find("a") text = a.contents[0] self.view.insert(edit, 0, text)
这专门添加了路径 sys.path 如果它不存在,则允许导入和使用模块。
Sublime包含自己独特的Python版本,专门用于沙盒本身,因此它根本不依赖于任何版本的python或正在用于运行它的计算机上安装的任何python包,这就是为什么它不这样做对你默认。