Python3.req.py

Материал из ALT Linux Wiki

Пришла пора переписать python3.req.py из пакета rpm-build-python3. Причина: altbug #40116. Если коротко: в python 3.10 окончательно упразднили модули parser и symbol, которые составляют главную логику этого скирпта. Сам скрипт небольшой, но код довольно плотный и функциональностей в нём много.

Текущая функциональность

Скрипт получает из командной строки (если она пуста — читает из stdin) список файлов, предположительно, питоновских или .so-библиотек.

Обработка .so

В случае .so он не проверяет, что библиотека действительно имеет отношение к python, и просто выдаёт версию ABI

$ python3 python3.req.py /usr/lib64/libaa.so.1
python3.9-ABI(64bit)

Обработка (предположительно) python файлов

Если файл не .so, .pyc, .pyo, или .pth, он пытается его распрасить соответствующим модулем.

  • Для .py файлов и файлов c любым шебангом ошибка парсинга означает ошибку
  • Для остальных файлов это предупреждение о том, что файл, возможно, не питоновский
  • Пустые файлы игнорируются

В результате на стандартный вывод выдаётся список зависимостей в принятом для python3 формате:

$ python3 python3.req.py python3.req.py
python3(os)
python3(os)
python3(parser)
python3(symbol)
python3(token)
python3(types)
python3(subprocess)
python3(re)
python3(encodings)
python3(subprocess)

TODO При этом в диагностике выводится python3.req: python3.req.py: skipping sys. Почему sys пропущен, а os — нет?

Переменные окружения

TODO

Логика работы

TODO

Кодировки

В текущем python3.req.py довольно много места посвящено разборкам с кодировками (PEP263). PEP это действующий, python3 его поддерживает.

TODO: проверить, нужна ли эта логика определения кодировки и зависимость на соответствующий модуль, всё равно `encodings` входят в python3-base

TODO

  • по возможности распараллелить, не дожидаясь этого в rpm-build?