Почти на всех машинах (за которые отвечаю я) установлен третий пайтон. А вместе с интерпретатором устанавливаются и модули стандартной библиотеки, некоторые из которых могут работать как самостоятельные утилиты командной строки. Я, например, давно уже пользуюсь модулем http.server для переброса файлов между машинами одной сети. Или json.tool для человеко-читаемого отображения json-данных (хотя постоянно забываю опцию --no-ensure-ascii для отображения русскоязычных строк).
Вот я и решил погрепать стандартные модули Python 3.11 на предмет встроенных полезных утилит.
У меня нет желания дублировать здесь официальную документацию. Поэтому для модулей, имеющих описание режима утилиты командной строки на сайте docs.python.org, я просто оставлю ссылки:
dis - Disassembler for Python bytecode
The gzip module provides a simple command line interface to compress or decompress files.
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
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. Утилита оперирует переданным в качестве аргумента файлом, но встретив значение `-` переключается на работу со стандартным потоком ввода. Пример:
$ echo "Aladdin:open sesame" | python -m base64 - QWxhZGRpbjpvcGVuIHNlc2FtZQo= $ echo QWxhZGRpbjpvcGVuIHNlc2FtZQo= | python -m base64 -d - Aladdin:open sesame
Утилита кодирования в ROT13: простой шифр для символов английского алфавита, реализуемый сдвигом ("rotate") на 13 позиций в алфавите. Символы не из английского алфавита остаются "как есть", например:
$ echo test-тест | python3 -m encodings.rot_13 grfg-тест $ echo grfg-тест | python3 -m encodings.rot_13 test-тест
Модуль сравнения файлов двух директорий на файловой системе.
Например создадим тестовые данные:
$ 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 утилита будет сравнивать рекурсивно (все под-директории).
Модуль реализации 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.
Попалась в интернете ссылка:
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
Модуль работы с MIME. В режиме утилиты командной строки можно как искать тип содержимого по имени файла (или его полному URL), например:
$ python3 -m mimetypes not_exist.jpg type: image/jpeg encoding: None
Так и наоборот: по типу содержимого искать подходящее расширение файла. Для этого нужно указывать аргумент -e, например:
$ python3 -m mimetypes -e image/jpeg .jpg
Модуль получения текущей платформы (операционная система и архитектура аппаратного обеспечения), на которой исполняется интерпретатор. Утилита командной строки печатает полученную платформу в стандартный поток вывода:
$ python3 -m platform OpenBSD-7.5-amd64-64bit-ELF
Модуль в режиме утилиты командной строки выводит общую информацию о платформе, пути и конфигурацию, с которой был собран Python (опции из Makefile и заголовочного файла pyconfig.h).
Модуль само-рефлексии 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
Модуль в качестве утилиты командной строки выводит индексную информацию о 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