Создание пакетов с модулями Python3

Материал из Rosalab Wiki
Перейти к: навигация, поиск

Python3 - современная линейка версий языка и интерпретатора Python, вот уже несколько лет усиленно вытесняющая Python2. Поскольку многие проекты все еще ориентируются на Python2, то для многих модулей Python в РОСЕ предусмотрено два варианта - для Python2 и Python3. Оформляются эти "варианты" как отдельные пакеты - обычно python-foo содержит модуль foo для Python2, а python3-foo - foo для Python3.

Если в репозитории уже есть пакет python-foo, то можно достаточно быстро создать на его основе python3-foo (если пакета нет, то необходимо сначала его создать). Для этого ищем проект для python-foo в группе import на ABF - и клонируем его в свой репозиторий в ABF под именем python3-foo (с помощью кнопки «Fork»).

Далее клонируем git-репозиторий проекта на локальную машину, переключаемся на ветку Git с названием "rosa2016.1" и переименовываем spec-файл python-foo.spec в python3-foo.spec. Для верности, обрабатываем этот файл инструментом spec-cleaner. Выглядит это в командной строке примерно так:

$ abf get <your_abf_login>/python3-foo -b rosa2016.1
$ cd python3-foo
$ git mv python-foo.spec python3-foo.spec
$ spec-cleaner python3-foo.spec

После чего внутри файла python3-foo прочесываем поля BuildRequires, Requiers, Suggest и Conflicts на предмет наличия там строк, начинающихся с «python-» или «pythonegg». Такие вхождения меняем на python3- и python3egg соответственно. Т.е. такие вот строки:

BuildRequires: python-devel
Requires: pythonegg(setuptools)

Должны преобразоваться в такие:

BuildRequires: python3-devel
Requires: python3egg(setuptools)

Теперь смотрим на секции %build, %install и %check (если есть) и заменяем там вызов команды python на вызов python3.

Наконец, смотрим на секцию %files и заменяем макросы, начинающиеся на %{py_, соответствующими макросами, начинающимися на %{py3_. Например, такая строка:

%{py_platsitedir}/%{module}/foo.py*

должна превратиться в такую:

%{py3_platsitedir}/%{module}/foo.py*

Такую замену макросов %{py_ надо сделать и в других местах spec-файла, если эти макросы там вдруг встретятся.

Теперь получившийся пакет надо собрать. Для этого сначала надо установить пакеты, которые требуются для его сборки (прописаны в BuildRequires). Для этого внутри директории python3-foo выполняем команду:

$ urpmi python3-foo.spec

Если вам сообщат, что зависимости не могут быть установлены, т. к. не хватает пакета python3-bar, то вам надо сначала собрать python3-bar, а уже потом возвращаться к python3-foo.

Если все ok, то извлекаем с ABF необходимые для сборки файлы и запускаем саму сборку с помощью rpmbuild:

$ abf fetch
$ rpmbuild -bb python3-foo.spec

В идеале, все должно собраться сразу. Часто могут возникать проблемы из-за того, что где-то забыли поменять «python» на «python3» или «py» на «py3». Иногда встречаются и специфические для python3 ошибки, так что если за разумное время пакет собрать не удалось, лучше обратиться к разработчикам РОСЫ.

Получившийся в результате пакет необходимо попробовать установить с помощью urpmi:

$ urpmi --

Установка

В графическом окружении
В dnfdragora найдите пакет создание пакетов с модулями python3 и установите его.
Через терминал
В терминале наберите следующую команду: sudo dnf in создание пакетов с модулями python3

Не можете найти нужный пакет? Проверьте, правильно ли подключены репозитории.test ~/rpmbuild/RPMS/<pkg_arch>/python3-foo-<version>.rpm

Здесь <pkg_arch> может принимать значение i586, x86_64 или noarch – это зависит от архитектуры вашей системы и от того, помечен ли пакет как независимый от архитектуры (это определяется наличием конструкции "BuildArch: noarch" в spec-файле). Посмотрите на вывод rpmbuild – он выводит пути к собранным пакетам. Если urpmi сообщит, что не может установить зависимость типа python3-pad, то вам нужно также озаботиться созданием пакета python3-pad. Для сборки python3-foo он не нужен, но вот для его работы понадобится.

Наконец, неплохо бы убедиться в работоспособности полученного модуля - хотя бы написать небольшой скрипт на python3, импортирующий этот модуль.

Как только пакет успешно собрался, отправляем результаты назад на ABF:

 $ abf put -m «Created python3 module»

И докладываем разработчикам РОСЫ о том, что пакет готов и лежит на ABF.