Пишем на Питоне конвертер mp3 в opus для Linux, установка с pip

newbie

Опубликован:  2020-03-06T09:07:14.229499Z
Отредактирован:  2020-03-11T08:00:06.377714Z
2900
Продолжаем разработку конвертера mp3pus, в этом обзоре я покажу процесс создания стандартного пакета mp3pus, который в случае необходимости можно опубликовать на PyPI, как дополнительный бонус, такой пакет можно легко и просто установить в систему с помощью PIP. Все необходимые для этого действия продемонстрирую в пошаговом режиме с командами и снимками экрана, всё, как мы любим...

1. В предыдущих сериях

В предыдущем выпуске блога я показал начальную стадию разработки конвертера mp3pus. На текущий момент у меня есть git-репозиторий, и рабочий каталог с исходником, который в терминале выглядит следующим образом.

rbVkfg4n43.png

Поскольку программа опубликована на github.com и имеет лицензию, будет правильно создать стандартный пакет, который можно будет опубликовать на PyPI и установить в систему при помощи PIP. Такова цель настоящего обзора.

Следует иметь ввиду, что все исполненные и продемонстрированные в рамках этого обзора команды выполняются в текущем базовом каталоге mp3pus, на снимке экрана выше подчёркнуто красным фломастером. Приступим..?

2. Модифицируем базовый каталог mp3pus

Стандартный пакет Python предполагает наличие в базовом каталоге с исходниками соответствующих каталогов и файлов. Поскольку mp3pus имеет исполняемый файл, мне потребуется каталог bin, кроме этого, исходник программы совершенно естественным образом будет расти, и поэтому есть смысл предусмотреть возможность разделить его на несколько модулей. Все модули будут храниться во вложенном одноимённом каталоге - mp3pus. Создаю оба каталога.

mkdir bin
mkdir mp3pus

5P8MBy4zHN.png

В базовом каталоге программы лежит файл с исходным кодом - mp3pus.py, и символическая ссылка на этот файл размещена в каталоге /usr/local/bin, это даёт возможность запускать программу в терминале в любом каталоге файловой системы. Перемещаю этот файл в каталог bin.

git mv -v mp3pus.py bin/mp3pus

SGNngqd3Ra.png

Впоследствии, при установке программы в систему с помощью PIP, все файлы из каталога bin программа установки переместит в один из каталогов переменной окружения PATH, и таким образом будет обеспечен запуск mp3pus в терминале из любого каталога файловой системы. Но в моей рабочей операционной системе в процессе разработки программы мне удобно будет запускать её по-прежнему одноимённой командой, как это делалось раньше, поэтому файл mp3pus.py придётся восстановить, об этом чуть позже, а чтобы он не попал в git, редактирую файл .gitignore.

jC1UEJ35Gq.png

Создаю дандеринит-файл во вложенном каталоге mp3pus.

nano mp3pus/__init__.py

На текущий момент в этом файле определяю одну единственную переменную.

KfVU61lSQD.png

Теперь мне нужно сохранить изменения git-репозитория, для этого сделаю промежуточный коммит. Текущее состояние репы можно просмотреть с помощью команды git status.

ZlTVApHvds.png

Выполняю последовательно две команды: git add . и git commit.

wjUy7Oytjs.png

Так как имя mp3pus.py внесено в файл .gitignore, я могу восстановить этот файл в базовом каталоге программы, это даст возможность запускать программу в любом каталоге файловой системы, при этом мне необходимо, чтобы все изменения в этом файле дублировались в файл bin/mp3pus. Создаю жесткую ссылку.

ln -T /home/newbie/workspace/mp3pus/bin/mp3pus /home/newbie/workspace/mp3pus/mp3pus.py

Следует обратить внимание, что при создании ссылки я использовал абсолютные адреса файлов.

lfyPWVLGhg.png

С помощью git status можно убедиться, что файл mp3pus.py не появится в git, при этом я по-прежнему имею возможность запускать программу в терминале одноимённой командой.

4JcoBaE81J.png

Такое состояние репозитория даст мне возможность тестировать программу в терминале, при этом не переустанавливая её в pip после каждого изменения кода mp3pus. Можно двигаться дальше...

3. Делим исходник на модули

Вполне вероятно, что в перспективе mp3pus получит дополнительные возможности, что означает рост исходника в объёме и количестве строк. Чтобы не иметь каждый раз дело с простынёй на 100500 строк, чтобы программу было удобно читать и поддерживать, целесообразно разделить исходник на модули. На текущий момент я выделю один дополнительный модуль, его файл создам во вложенном каталоге mp3pus.

touch mp3pus/convert.py

Запускаю PyCharm, открываю только что созданный файл и переношу в этот файл из файла mp3pus.py класс Target, следует обратить внимание, что вместе с классом сюда же переедет и часть импортов.

jr9Npq16XV.png

Чтобы ничего не сломать, вместе с переносом класса следует некоторым образом изменить файл mp3pus.py, все изменённые строчки отмечу на снимке экрана ниже красным маркером.

pnqS0kTvb5.png

Возвращаюсь в терминал и проверяю состояние репозитория.

njfmlrkuhx.png

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

osYYFpGqHR.png

Дожидаюсь завершения конвертирования всех файлов.

Q3e9gmKiHH.png

Проверяю метаданные любого из полученных файлов.

Pg3Le4M8P7.png

Всё работает в штатном режиме, как было задумано и реализовано. Радуюсь, что ничего не сломал, и приступаю к созданию пакета для pip...

4. Создаём сценарий инсталляции

Для установки Python-пакета mp3pus с помощью pip необходимо создать сценарий инсталляции. Создаю и открываю в редакторе PyCharm новый файл - setup.py, этот файл получит следующий код.

from setuptools import setup, find_packages

from mp3pus import version

setup(
    name='mp3pus',
    version=version,
    packages=find_packages(),
    python_requires='~=3.7',
    install_requires=['mutagen>=1.40'],
    zip_safe=False,
    scripts=['bin/mp3pus'],
    author='AndreyVM',
    author_email='webmaster@auriz.ru',
    description='A simple mp3 to opus converter.',
    license='GNU GPLv3',
    keywords='mp3 opus converter',
    url='https://auriz.ru/d7Po8UxK')

i7IJXPpD53.png

На текущий момент состояние файла setup.py - чистая гипотеза, проверять которую я буду на виртуальной машине с десктопом Debian buster на борту. А пока делаю коммит и запушиваю все изменения на github.com.

KllWxOhhvu.png

Пришло время протестировать всё это великолепие на другой системе, об этом далее...

5. Тестируем установку mp3pus с помощью pip

Для тестирования mp3pus и его программы установки самым великолепным образом подойдёт виртуальная машина с Debian buster на борту. Мне необходимо подтвердить гипотезу и убедиться, что с помощью pip моя программа правильно устанавливается и затем правильно функционирует. Делать это на рабочем лэптопе не совсем правильно, потому что всегда имеется риск сломать систему ошибочными действиями. А вот на виртуалке неправильные действия большого урона не принесут, для того она и существует, чтобы тестировать, ломать и восстанавливать.

Чтобы mp3pus правильно работал, необходимо установить на десктоп виртуалки используемые в программе зависимости: lame, opuenc и mutagen.

sudo apt install lame opus-tools python3-mutagen

PqODu7wjMh.png

Кроме этого мне потребуется git, поскольку mp3pus пока опубликован только на github.com.

sudo apt install git

DLeaNif7LV.png

Создаю каталог для клонирования git-репозитория и вхожу в него.

mkdir py-workspace
cd py-workspace

CxJBbVwJbm.png

Клонирую mp3pus в этот только что созданный каталог.

git clone https://github.com/newbie-c/mp3pus.git

jP9d9BNOuI.png

Мне необходим pip, устанавливаю в систему соответствующий пакет.

sudo apt install -y python3-pip

JLyx3VapOs.png

Дожидаюсь полного завершения этого процесса. Всё готово к установке mp3pus. Вхожу в базовый каталог mp3pus и запускаю установку.

cd mp3pus/
sudo pip3 install .

T0tIYnx1Ne.png

Здесь следует иметь ввиду, что программа устанавливается в системные каталоги операционной системы, а не в виртуальное окружение, поэтому pip я запустил с использованием sudo, mp3pus, таким образом, установлен в систему, можно попробовать что-нибудь конвертировать. У меня есть пара альбомов с mp3. Создаю новый каталог в хомяке текущего пользователя, захожу в него и запускаю процесс mp3pus.

mp3pus -i ~/share/Гоша\ Куценко\ -\ 2018\ -\ Слова/ -d .

Процесс пошёл...

uqISLkvVNj.png

Дожидаюсь его завершения и проверяю один из полученных файлов в текущем каталоге.

tmKfjG3DFz.png

Метаданные полученного файла opus соответствуют метаданным исходного mp3. Гипотеза подтверждена, mp3pus стал полноценным пакетом, его можно опубликовать на PyPI, перенести на любую операционную систему Linux и установить с помощью pip. Цель этого обзора полностью достигнута.

6. Продолжение следует

Очевидно, что на текущий момент mp3pus не в лучшем состоянии, и предстоит вдумчивая и сосредоточенная работа над программой. В одном из следующих выпусков этого блога я покажу обработку некоторых исключительных ситуаций в коде программы. Продолжение следует, будет интересно...

Комментарии: