50ae12a099b01792 8 951 98 30 964 info@severcart.org
Русский English

Полезные модули стандартной библиотеки Python

27 декабря 2017 г.

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

Обмен файлами

Очень полезным инструментом является модуль http. Данный модуль обеспечивает совместное использование локальных файлов, во внутренней сети. Чтобы запустить встроенный веб-сервер и отдавать файлы из текущего каталога по протоколу http, выполним следующую команду:

# Python 3
$ python3 -m http.server

# Python 2
$ python2 -m SimpleHTTPServer

Теперь файлы в локальном каталоге – это ссылки, которые доступны по URL http://localhost:8000/. Другие компьютеры в локальной сети могут получить доступ к файлам указав IP адрес компьютера на котором выполняется http сервер.

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

Преттификация JSON

json.tool – удобный способ печати и проверки файлов формата JSON из командной строки.

$ echo '{"json":"obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{ 1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

Таким образом можно отлаживать интеграцию с HTTP API, которые возвращают результаты в формате JSON.

Отладка

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

$ python -m pdb script.py

Если нужно чтобы отладчик остановился в определенном месте выполнения, просто добавьте в код приведенный ниже оператор.

import pdb; pdb.set_trace()

Анализ производительности

Модуль timeit позволяет выполнить замер времени выполнения фрагмента кода. Модуль может опционально принимать настроечный код, а затем многократно запуская тестовый код (по умолчанию 10 000 000 раз) возвращать наилучшее время выполнения в микросекундах.

$ python -m timeit -s 'text = "sample string"; char = "g"'  'char in text'
10000000 loops, best of 3: 0.0408 usec per loop
$ python -m timeit -s 'text = "sample string"; char = "g"'  'text.find(char)'
10000000 loops, best of 3: 0.195 usec per loop

Некоторые полезные параметры командной строки:

-n - количество повторений оператор (по умолчанию 10M)

-r - количество повторений по таймеру (по умолчанию 3)

-s - настроечная инструкция, выполняемая один раз перед тестированием

Профилирование модулем cProfile позволяет легко измерить время, затрачиваемое на выполнение сценария.

$ python cProfile scriptfile [arg] ...

Пара полезных флагов:

-o - путь к выходному файлу -s - сортировка вывода

Доктесты и юнитесты

Доктесты запускаются из командной строки с помощью исполняемого модуля doctest

$python -m doctest -v example.py

Аналогично, юниттесты могут выполняться с использованием модуля unittest

$python3 -m unittest

Эта инструкция сканирует текущий каталог в поисках тестов, если их находит, то производится их запуск. Мы также можем запускать только определенные модули или функции.

Создание и открытие файлов архива Zip и TAR

Если у вас нет инструментов tar или zip под рукой, то в Python 3 уже строены модули tarfile и zipfile позволяющие нам объединять каталоги в архивы, а также распаковывать существующие.

# Создание нового TAR архива
$ python3 -m tarfile -c <tarname>.tgz <file> <file>

# Извлечение файлов TAR архива
$ python3 -m tarfile -e <tarname>.tgz

Создание исполняемых zip файлов

Модуль zipapp предоставляет инструменты для управления созданием zip файлов, содержащих Python код, которые могут быть выполнены непосредственно интерпретатором Python.

$ python3 -m zipapp myapp
$ python3 myapp.pyz
<output from myapp>

Base64 кодирование и декодирование

При работе с REST API, особенно в тех случаях, когда используются токены аутентификации, применение кодировки Base64 довольно распространено. Модуль Python base64 может использоваться из командной строки или в теле скрипта.

$ python -m base64 –e

Распечатка календаря на текущий год

Знали ли вы, что Python поставляется со встроенным текстовым календарем? Модуль calendar является исполняемым и может принимать множество параметров, которые позволяют настроить его отображение.

$ python -m calendar

  2017

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5             1  2  3  4  5
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       6  7  8  9 10 11 12
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      13 14 15 16 17 18 19
16 17 18 19 20 21 22      20 21 22 23 24 25 26      20 21 22 23 24 25 26
23 24 25 26 27 28 29      27 28                     27 28 29 30 31
30 31
…

Печать системной конфигурации

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

C:\Users\user>python -m sysconfig
Platform: "win32"
Python version: "3.6"
Current installation scheme: "nt"

Paths:
        data = "C:\Python"
        include = "C:\Python\Include"
        platinclude = "C:\Python\Include"
        platlib = "C:\Python\Lib\site-packages"
        platstdlib = "C:\Python\Lib"
        purelib = "C:\Python\Lib\site-packages"
        scripts = "C:\Python\Scripts"
        stdlib = "C:\Python\Lib"

Variables:
        BINDIR = "C:\Python"
        BINLIBDEST = "C:\Python\Lib"
        EXE = ".exe"
        EXT_SUFFIX = ".pyd"
        INCLUDEPY = "C:\Python\Include"
        LIBDEST = "C:\Python\Lib"
        SO = ".pyd"
        VERSION = "36"
        abiflags = ""
        base = "C:\Python"
        exec_prefix = "C:\Python"
        installed_base = "C:\Python"
        installed_platbase = "C:\Python"
        platbase = "C:\Python"
        prefix = "C:\Python"
        projectbase = "C:\Python"
        py_version = "3.6.3"
        py_version_nodot = "36"
        py_version_short = "3.6"
        srcdir = "C:\Python"
        userbase = "C:\Users\user\AppData\Roaming\Python"