{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Аргументы командной строки\n", "\n", "Чтобы сделать из скрипта целостную программу, которую смогут запускать другие пользователи или другие программы необходимо предоставить интерфейс для её использования [API](https://ru.wikipedia.org/wiki/API). Один из видов `API` --- интерфейс для командной строки. В качестве примера программы с таким интерфейсом можно привести компиляторы, а также интерпретатор `CPython`. \n", "\n", "## sys.argv\n", "\n", "Рассмотрим скрипт `myscript.py` с следующим содержимым\n", "```python\n", "import sys\n", "\n", "print(sys.argv)\n", "```\n", "\n", "Обычный запуск скрипта будет выглядеть как-то так\n", "```sh\n", ">>> python myscript.py\n", "['myscript.py'] \n", "\n", ">>>\n", "```\n", "Но можно передать аргументы скрипту при его запуске, указывая их после имени скрипта\n", "\n", "```sh\n", ">>> python python myscript.py arg1 arg2 arg3\n", "['myscript.py', 'arg1', 'arg2', 'arg3']\n", "\n", ">>>\n", "```\n", "\n", "На первом месте всегда идёт имя скрипта, а далее аргументы командной строки. Далее можно выстроить логику программу таким образом, чтобы учитывать значения переданных параметров. Обычно для этого используют модуль стандартной библиотеки [argparse](https://docs.python.org/3/library/argparse.html).\n", "## argparse\n", "\n", "Рассмотрим базовые возможности модуля [argparse](https://docs.python.org/3/library/argparse.html).\n", "\n", "Предположим файл `myscript.py` имеет следующее содержимое.\n", "```python\n", "import argparse\n", "\n", "parser = argparse.ArgumentParser()\n", "parser.add_argument('--config', default='default_config.json', help='Путь к конфигурационному файлу')\n", "parser.add_argument('-o', required=True, help='Папка для записи результатов вычисления')\n", "parser.add_argument('-n', type=int, default=100, help='Количество разбиений по оси времени')\n", "args = parser.parse_args()\n", "\n", "print(args)\n", "```\n", "Объявлено три ожидаемых аргумента\n", "- путь к конфигурационному файлу по ключу `--config` с значением по умолчанию;\n", "- название папки (ключ `-o`), в которую следует записать результаты всех вычислений. Т.к. важно не перезаписывать предыдущие результаты, то этот аргумент сделаем обязательным;\n", "- количество разбиений по оси `t`, которое необходимо использовать для расчетов. Явно укажем здесь, что ожидается целое число. \n", "\n", "\n", "Для каждого параметра указана справочная информация, которую можно теперь получить следующим образом.\n", "```sh\n", ">>> python myscript.py --help\n", "usage: myscript.py [-h] [--config CONFIG] -o O [-n N]\n", "\n", "optional arguments:\n", " -h, --help show this help message and exit\n", " --config CONFIG Путь к конфигурационному файлу\n", " -o O Папка для записи результатов вычисления\n", " -n N Количество разбиений по времени\n", " \n", "```\n", "\n", "А запустить скрипт можно, передавая ему разные значения.\n", "```sh\n", ">>> python myscript.py --config config.json -o somefolder -n 300\n", "Namespace(config='config.json', n=300, o='somefolder')\n", "\n", ">>> python myscript.py --config config.json -o somefolder \n", "Namespace(config='config.json', n=100, o='somefolder')\n", "\n", ">>> python myscript.py\n", "usage: myscript.py [-h] [--config CONFIG] -o O [-n N]\n", "myscript.py: error: the following arguments are required: -o \n", "\n", ">>>\n", "```\n", "\n", "\n", "\n", "\n" ] } ], "metadata": { "language_info": { "name": "python" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }