Ад зависимостей с 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"). Зависимости в
dist
dir кажется правильным. Кажется, ничего не пропало. Я получаю ту же ошибку, когда упаковываю скрипт как 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.