首页 > 解决方案 > Beautifulsoup4 和 lxml 的依赖地狱

问题描述

我使用 Python 3.8 构建了一个小型实用程序。除其他外,它使用 beautifulsoup4 和 lxml 从 XML 文件中提取一些数据。我使用 PyCharm 和 virtualenv 进行开发,我的实用程序运行良好。

为了将 util 分发给其他人,我有一个构建脚本,它将我的代码复制到一个dist目录并使用pip install -r requirements.txt -t dist. 这也很好,我可以dist从我的系统解释器(3.8,没有beautifulsoup,没有lxml)运行目录中的代码。可以从 加载依赖项dist,它出现了。

但是,它不适用于其他机器。该脚本产生错误消息

找不到具有您要求的功能的树生成器:lxml。您需要安装解析器库吗?

这意味着beautifulsoup4 找不到lxml(与“lxml-xml”或“xml”相同)。不过,目录中的依赖dist项似乎是正确的。似乎什么都没有。当我使用 将脚本打包为 zip 应用程序时,我得到了同样的错误python -m zipapp -p "python" dist,这会产生一个文件dist.pyz。它可以在我自己的机器上执行,但会遇到相同的错误消息。

这是我的 requirements.txt 文件:

beautifulsoup4
jinja2
lxml

这是 BeautifulSoup 解析器的实例化:

soup = BeautifulSoup(xml_data, features='lxml')

xml_data 只是一个字符串,其中包含一些从另一个工具生成的文件中读取的有效 XML。

我没主意了。我在 .NET 和 Java 方面有很多经验,但我不是这个星球上最伟大的 Python 编码器。看来我已经进入了依赖地狱的Python版本......我真的不想让脚本的用户pip install lxml在他们的机器上调用。我想分发一个包含所有依赖项的独立应用程序。

任何帮助表示赞赏。

更新

requirements.txt 中条目的顺序没有区别(正如我所希望的那样)。

我添加了

from lxml.builder import ElementMaker
...
e = ElementMaker()

到主脚本,以便将 lxml 导入我的脚本。这会产生错误

回溯(最后一次调用):文件“C:\Program Files\Python38\lib\runpy.py”,第 194 行,在 _run_module_as_main return _run_code(code, main_globals, None, File "C:\Program Files\Python38\lib \runpy.py”,第 87 行,在run_code exec(code, run_globals) 文件中“dist.pyz_main.py ,第 4 行,在文件“”中,第 259 行,在 load_module 文件中“dist.pyz\lrg.py” ,第 3 行,文件“”,第 259 行,load_module 文件“dist.pyz\lxml\builder.py”,第 44 行,ModuleNotFoundError:没有名为“lxml.etree”的模块

当作为 zip 应用程序运行时,但在我使用 virtualenv 的 IDE 中运行良好。

标签: pythonbeautifulsouppipzipapp

解决方案


推荐阅读