beautifulsoup4和lxml的依赖关系地狱

2024-04-19 21:45:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python3.8构建了一个小实用程序。除此之外,它还使用beautifulsoup4和lxml从XML文件中提取一些数据。我使用PyCharm和virtualenv进行开发,我的实用程序运行良好

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

不过,它在其他机器上不起作用。脚本生成错误消息

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

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

这是我的requirements.txt文件:

beautifulsoup4
jinja2
lxml

这是BeautifulSoup解析器的实例化:

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

xml_数据只是一个字符串,其中包含从另一个工具生成的文件中读取的有效xml

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

感谢您的帮助

更新

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

我补充说

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

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

Traceback (most recent call last): File "C:\Program Files\Python38\lib\runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Program Files\Python38\lib\runpy.py", line 87, in run_code exec(code, run_globals) File "dist.pyz_main.py", line 4, in File "", line 259, in load_module File "dist.pyz\lrg.py", line 3, in File "", line 259, in load_module File "dist.pyz\lxml\builder.py", line 44, in ModuleNotFoundError: No module named 'lxml.etree'

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


Tags: 文件runinpy目录脚本dist错误