Утилиты, встроенные в Python

Почти на всех машинах (за которые отвечаю я) установлен третий пайтон. А вместе с интерпретатором устанавливаются и модули стандартной библиотеки, некоторые из которых могут работать как самостоятельные утилиты командной строки. Я, например, давно уже пользуюсь модулем http.server для переброса файлов между машинами одной сети. Или json.tool для человеко-читаемого отображения json-данных (хотя постоянно забываю опцию --no-ensure-ascii для отображения русскоязычных строк).

Вот я и решил погрепать стандартные модули Python 3.11 на предмет встроенных полезных утилит.

Документированные модули

У меня нет желания дублировать здесь официальную документацию. Поэтому для модулей, имеющих описание режима утилиты командной строки на сайте docs.python.org, я просто оставлю ссылки:

The calendar module can be executed as a script from the command line to interactively print a calendar

The Python Profilers

dis - Disassembler for Python bytecode

The gzip module provides a simple command line interface to compress or decompress files.

http.server - HTTP servers

The json.tool module provides a simple command line interface to validate and pretty-print JSON objects

Tools for pickle developers

pydoc - Documentation generator and online help system

py_compile - Compile Python source files

site - Site-specific configuration hook

The tarfile module provides a simple command-line interface to interact with tar archives

timeit — Measure execution time of small code snippets

tokenize — Tokenizer for Python source

trace - Trace or track Python statement execution

The unittest module can be used from the command line to run tests from modules, classes or even individual test methods

Creation of virtual environments is done by executing the command venv

webbrowser - Convenient web-browser controller

zipapp - Manage executable Python zip archives

The zipfile module provides a simple command-line interface to interact with ZIP archives

Недокументированные модули

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

base64

Недокументированная (на текущий момент) возможность запуска модуля base64 для [рас-]кодирования данных в формате Base64. Утилита оперирует переданным в качестве аргумента файлом, но встретив значение `-` переключается на работу со стандартным потоком ввода. Пример:

$ echo "Aladdin:open sesame" | python -m base64 -
QWxhZGRpbjpvcGVuIHNlc2FtZQo=
$ echo QWxhZGRpbjpvcGVuIHNlc2FtZQo= | python -m base64 -d -
Aladdin:open sesame

encodings.rot_13

Утилита кодирования в ROT13: простой шифр для символов английского алфавита, реализуемый сдвигом ("rotate") на 13 позиций в алфавите. Символы не из английского алфавита остаются "как есть", например:

$ echo test-тест | python3 -m encodings.rot_13
grfg-тест
$ echo grfg-тест | python3 -m encodings.rot_13
test-тест

filecmp

Модуль сравнения файлов двух директорий на файловой системе.

Например создадим тестовые данные:

$ mkdir sub1
$ echo "" > sub1/file
$ echo "sub1-file1" > sub1/file1
$ echo "sub1-file2" > sub1/file2
$ mkdir sub2
$ echo "" > sub2/file
$ echo "sub2-file1" > sub2/file1
$ echo "sub2-file3" > sub2/file3

Результат сравнения директорий:

$ python3 -m filecmp sub1 sub2
diff sub1 sub2
Only in sub1 : ['file2']
Only in sub2 : ['file3']
Identical files : ['file']
Differing files : ['file1']

Указав ключ -r утилита будет сравнивать рекурсивно (все под-директории).

ftplib

Модуль реализации FTP клиента. Как можно догадаться, утилита командной строки этого модуля реализует простой FTP клиент. Например следующая команда:

$ python3 -m ftplib test.rebex.net -l. readme.txt -dpub/example -l.
drwx------ 2 anonymous users          0 Mar 31  2023 pub
-rw------- 1 anonymous users        379 Sep 19  2023 readme.txt
Welcome to test.rebex.net!

You are connected to an FTP or SFTP server used for testing purposes
by Rebex FTP/SSL or Rebex SFTP sample code. Only read access is allowed.

For information about Rebex FTP/SSL, Rebex SFTP and other Rebex libraries
for .NET, please visit our website at https://www.rebex.net/

For feedback and support, contact support@rebex.net

Thanks!
-r-------- 1 anonymous users      19156 Feb 16  2007 imap-console-client.png
-rw------- 1 anonymous users      36672 Mar 19  2007 KeyGenerator.png
-rw------- 1 anonymous users      24029 Mar 19  2007 KeyGeneratorSmall.png
-r-------- 1 anonymous users      16471 Feb 16  2007 mail-editor.png
-r-------- 1 anonymous users      35414 Feb 16  2007 mail-send-winforms.png
-r-------- 1 anonymous users      49011 Feb 16  2007 mime-explorer.png
-rw------- 1 anonymous users      58024 Mar 19  2007 pocketftp.png
-rw------- 1 anonymous users      20197 Mar 19  2007 pocketftpSmall.png
-r-------- 1 anonymous users      20472 Feb 16  2007 pop3-browser.png
-r-------- 1 anonymous users      11205 Feb 16  2007 pop3-console-client.png
-rw------- 1 anonymous users        379 Sep 19  2023 readme.txt
-rw------- 1 anonymous users      11546 Mar 19  2007 ResumableTransfer.png
-rw------- 1 anonymous users       2635 Mar 19  2007 winceclient.png
-rw------- 1 anonymous users       6146 Mar 19  2007 winceclientSmall.png
-rw------- 1 anonymous users      80000 Mar 19  2007 WinFormClient.png
-rw------- 1 anonymous users      17911 Mar 19  2007 WinFormClientSmall.png

Данные для аутентификации (в случае необходимости) берутся из файла `~/.netrc`. Утилите можно задать альтернативный файл .netrc через аргумент -r.

UPD: 2024-11-27 Конкретный пример

Попалась в интернете ссылка:

ftp://ftp.taygeta.com/pub/Forth/Compilers/native/unix/this4th.zip

"Современные" браузеры ftp уже не открывают, требуют внешнее приложение для открытия такой ссылки. С использованием модуля ftplib этот файл может быть скачан следующей командой:

$ python3 -m ftplib ftp.taygeta.com pub/Forth/Compilers/native/unix/this4th.zip > this4th.zip

mimetypes

Модуль работы с MIME. В режиме утилиты командной строки можно как искать тип содержимого по имени файла (или его полному URL), например:

$ python3 -m mimetypes not_exist.jpg
type: image/jpeg encoding: None

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

$ python3 -m mimetypes -e image/jpeg
.jpg

platform

Модуль получения текущей платформы (операционная система и архитектура аппаратного обеспечения), на которой исполняется интерпретатор. Утилита командной строки печатает полученную платформу в стандартный поток вывода:

$ python3 -m platform
OpenBSD-7.5-amd64-64bit-ELF

sysconfig

Модуль в режиме утилиты командной строки выводит общую информацию о платформе, пути и конфигурацию, с которой был собран Python (опции из Makefile и заголовочного файла pyconfig.h).

inspect

Модуль само-рефлексии python-кода. Утилита командной строки по умолчанию получает имя python-объекта в формате "module:qualname", а в стандартный поток вывода печатает исходный код реализации этого объекта. Например:

$ python3 -m inspect inspect:ismodule
def ismodule(object):
    """Return true if the object is a module.

    Module objects provide these attributes:
        __cached__      pathname to byte compiled file
        __doc__         documentation string
        __file__        filename (missing for built-in modules)"""
    return isinstance(object, types.ModuleType)

Если указать аргумент -d, то в стандартный поток вывода печатается мета-информация об объекте. Например:

$ python3 -m inspect -d inspect:ismodule
Target: inspect:ismodule
Origin: /usr/lib/python3.11/inspect.py
Cached: /usr/lib/python3.11/__pycache__/inspect.cpython-311.pyc
Line: 282

pyclbr

Модуль в качестве утилиты командной строки выводит индексную информацию о python-модуле. Целевой модуль может быть задан как просто по имени, так и путём к py-файлу, например:

$ python3 -m pyclbr /usr/lib/python3.11/pyclbr.py
class _Object [] 53
  def __init__ 55
class Function [<__main__.Class object at 0x7efce054fdd0>] 68
  def __init__ 70
class Class [<__main__.Class object at 0x7efce054fdd0>] 78
  def __init__ 80
def _nest_function 89
def _nest_class 94
def readmodule 100
def readmodule_ex 112
def _readmodule 122
class _ModuleBrowser [<__main__.Class object at 0x7efce0397b10>] 186
  def __init__ 187
  def visit_ClassDef 195
  def visit_FunctionDef 220
  def visit_AsyncFunctionDef 230
  def visit_Import 233
  def visit_ImportFrom 248
def _create_tree 269
def _main 275