Ад зависимостей с beautifulsoup4 и lxml

Я создал небольшую утилиту, используя Python 3.8. Помимо прочего, он извлекает некоторые данные из файлов XML с помощью beautifulsoup4 и lxml. Я использую PyCharm и virtualenv для разработки, и моя утилита работает нормально.

Чтобы распространять утилиту среди других, у меня есть сценарий сборки, который копирует мой код в dist каталог и установите все зависимости в этот каталог, используя pip install -r requirements.txt -t dist. Это тоже отлично работает, и я могу запустить код в distкаталог из моего системного интерпретатора (3.8, без beautifulsoup, без lxml). Зависимости можно загрузить из dist, кажется.

Однако это не работает на других машинах. Скрипт выдает сообщение об ошибке

Не удалось найти построитель деревьев с запрошенными функциями: lxml. Вам нужно установить библиотеку парсера?

Это означает, что beautifulsoup4 не может найти lxml (то же самое с "lxml-xml" или "xml"). Зависимости в distdir кажется правильным. Кажется, ничего не пропало. Я получаю ту же ошибку, когда упаковываю скрипт как 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-приложение, но отлично работает в моей среде IDE, которая использует файл virtualenv.

0 ответов

Другие вопросы по тегам