Создаём свой пакет Python

Создаём свой пакет Python

Повторное использование кода — очень полезная штука. Вы экономите время при написание одних и тех же кусков кода, и даже в одном проекте у вас сохраняется модульная структура приложения, что позволяет поддерживать в актуальном состоянии каждый модуль отдельно от других. И в python довольно легко создать структуру приложения так, чтобы было легко его оформить в пакет. Этот гайд поможет вам научиться создавать такие пакеты с нуля так, чтобы другие люди могли воспользоваться им в своих приложениях.

Структура пакета

Файл с расширением ‘.py’ — это модуль. Вы можете создать в нём классы, функции и переменные с таким же именем, как у файла. А если в папку положить несколько модулей и создать файл ‘__init__.py’, вы создадите тем самым пакет с именем как у папки. Вот примерная файловая иерархия обычного пакета:

Создаём свой пакет Python
Сборка пакета

Теперь когда мы знаем структуру пакета, поговорим про его сборку. Самое важное здесь — конфигурационный файл ‘setup.py’. Основной смысл в нём — хранение метаданных о пакете. Вот пример такого файла:


from setuptools import setup, find_packages

setup(name='funniest',
      version='0.1',
      description='The funniest joke in the world',
      long_description='Really, the funniest around.',
      classifiers=[
        'Development Status :: 3 - Alpha',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 2.7',
        'Topic :: Text Processing :: Linguistic',
      ],
      keywords='funniest joke comedy flying circus',
      url='http://github.com/storborg/funniest',
      author='Flying Circus',
      author_email='flyingcircus@example.com',
      license='MIT',
      packages=find_packages(),
      install_requires=[
          'markdown',
      ],
      include_package_data=True,
      zip_safe=False)

Более подробно об этом файле можно прочитать в документации.

Указываем зависимости

Для того, чтобы с пакетом можно было работать сразу после установки, вы должны указать в его конфигурации, от каких пакетов он зависит, чтобы они были сразу же установлены. Нужно просто вставить ‘install_requires=[…]’ в функцию setup. Можно также задать версию зависимости:

install_requires=[‘A==1.0’, ‘B>=1,<2’]

Эти зависимости — общедоступные пакеты, которые можно установить с помощью утилиты pip. Но если ваши зависимости не перечислены в каталоге pypi, укажите их так:

dependency_links=[‘http://github.com/user/repo/tarball/master#egg=package-1.0']
Дополнительные файлы

Иногда бывает необходимость вложить в пакет другие типы файлов. Для этого:

  1. Задайте ‘include_package_data=True’
  2. Создайте файл MANIFEST.in в папке с setup.py
  3. Добавьте путь до файла в MANIFEST как ‘include /path/to/test.json’, путь при этом относительный. Также можно использовать поисковый шаблон типа ‘*.json’.
Сборка

Теперь у нас всё готово, приступаем к сборке пакета. Это значит, что мы создадим дистрибутив исходного кода (напр., tar.gz) или бинарный файл (напр., wheel). Это очень просто.

python setup.py sdist bdist_wheel

В результате у нас в папке ‘./dist’ появятся оба формата. при этом имя дистрибутива будет присвоено исходя из имени пакета и его версии.

Распространение пакета

Поздравляю, вы создали замечательный пакет! Теперь необходимо выложить его для общего доступа. Мы загрузим его на Pypi, поэтому в будущем можно будет его установить командой ‘pip install’.

Для начала создайте учётную запись на сайте pypi.

Затем выполните

twine upload dist/*

При этом файлы из папки ‘dist/’ выгрузятся в каталог pypi. Также вы можете явно указать только определённый файл для выгрузки. Twine это специальная утилита для работы с pypi. При первой загрузке пакета она зарегистрирует пакет в pypi.

Работа с пакетом

Теперь ваш пакет опубликован в pypi. Для его установки достаточно набрать ‘pip install my_package’, а затем в коде ‘import my_package’.

При локальной разработке пакета для его тестирования добавьте путь к нему в $PYTHONPATH. Но если вы не хотите трогать переменные окружения, установите его командой ‘pip install -e .’ из папки с пакетом.

По материалам «A Simple Guide for Python Packaging»

Pytube: скачиваем Youtube видео с помощью Python

Pytube: скачиваем Youtube видео с помощью Python


Pytube это библиотека для скачивания видео с Youtube. Как сказано в документации, у неё нет сторонних зависимостей и она построена на стандартной библиотеке.

Установка

Установить пакет можно с помощью менеджера пакетов pip:

pip install pytube

Эта команда найдёт пакет в репозитории, скачает его и установит на локальную машину. Вывод команды будет примерно таким:

Collecting pytube
  Downloading pytube-6.2.2-py2-none-any.whl
Installing collected packages: pytube
Successfully installed pytube-6.2.2
Работаем с pytube

После завершения установки откройте консоль python и импортируйте пакет pytube:

import pytube

Класс YouTube представляет экземпляр YouTube-сессии, поэтому его нужно инициализировать так:

yt = pytube.YouTube('https://www.youtube.com/watch?v=xtZOnyYu16U')

После этого в переменной yt будет храниться вся информация о переданном видео, к примеру название файла:

fn = yt.filename

Как известно, чтобы получить значение переменной в консоли python, нужно ввести её наименование и нажить кнопку Ввод на клавиатуре:

fn
Вы должны увидеть следующее:

u'Stoto - Late Night (Original Mix)'

Всё довольно очевидно — вы видите имя файла от переданной ссылки на видео при создании экземпляра класса в его методе YouTube.__init__.

Также нам доступен атрибут video_id, который определяется при создании экземпляра класса. Можно вывести его так:

video_id = yt.video_id
print(video_id)
'xtZOnyYu16U'

Доступные для скачивания видео можно получить методом get_videos:

videos = yt.get_videos()

Выведем в цикле каждое из них:

for v in videos:
    print(v)

Для моего видео вывод будет таким:

<Video: MPEG-4 Visual (.3gp) - 144p - Simple>
<Video: MPEG-4 Visual (.3gp) - 240p - Simple>
<Video: H.264 (.mp4) - 360p - Baseline>
<Video: H.264 (.mp4) - 720p - High>
<Video: VP8 (.webm) - 360p - N/A>

Тип каждого объекта получим так:

for v in videos:
    print(type(v))

Вывод должен быть таким:

<class 'pytube.models.Video'>
<class 'pytube.models.Video'>
<class 'pytube.models.Video'>
<class 'pytube.models.Video'>
<class 'pytube.models.Video'>

Класс pytube.models.Video используется для создания отдельных экземпляров видео с дальнейшим скачиванием.

Первый экземпляр можно получить по его индексу:

first_video = videos[0]
print(first_video)

Video имеет много атрибутов, таких как filename, url, extension, video_codec, audio_codec, audio_bitrate, resolution и т.д.

Расширение видео получим так:

first_video.extension
'3gp'

Качество видео:

quality = first_video.resolution
print(quality)
'144p'

Битрейт:

audio_bitrate = first_video.audio_bitrate
video_bitrate = first_video.video_bitrate
print(audio_bitrate)
print(video_bitrate)

Скачать видео также просто:

first_video.download('/Users/oltjano/Desktop')

Выбранное видео будет загружено в папку /Users/oltjano/Desktop

А если вам нужно перезаписать загруженное ранее видео, присвойте переменной force_overwrite значение True:

first_video.download(path='/Users/oltjano/Desktop', force_overwrite=True)

Скачиваем видео определённого формата

Начнём с начала. Перезапустите консоль python и введите:

import pytube
video_link = 'https://www.youtube.com/watch?v=8ZpVwAeLzm4'

Создадим Youtube сессию и запросим доступные форматы:

yt = pytube.YouTube(video_link)
videos = yt.videos

Используя метод get можно отфильтровать видео по формату и качеству:

video = yt.get('mp4', '720p')
Если такое видео будет доступно, в переменной появятся ссылки на него, иначе — будет выведена ошибка.

Итак, у нас нет ошибки, значит, видео можно скачать. Зададим путь для загруженного файла и загрузим видео:

path = '/Users/Oltjano/Desktop'
video.download(path)

Готово!

Источник: «Pytube: How to Download Youtube Videos with this Python Tool»