Настройка запуска скриптов Python: аргументы командной строки

Раздел: Автоматизация -> Запуск и выполнение скриптов

Основной способ: модуль argparse

Для обработки аргументов командной строки в Python наиболее эффективное решение — встроенный модуль argparse. Он поддерживает обязательные и опциональные параметры, типы, значения по умолчанию, автоматическую справку.

import argparse

parser = argparse.ArgumentParser(description='Пример')
parser.add_argument('input', help='Входной файл')
parser.add_argument('--output', '-o', default='result.txt', help='Выходной файл')
parser.add_argument('--verbose', action='store_true', help='Подробный вывод')
args = parser.parse_args()
print('Входной файл:', args.input)
print('Выходной файл:', args.output)
if args.verbose:
    print('Подробный вывод включен')

Python run args (передача аргументов в python скрипт)

Запуск: python script.py data.txt --output out.txt --verbose

Типичные ошибки:

  • Ошибка unrecognized arguments при неверном флаге.
  • Ошибка required при пропуске обязательного аргумента.
  • Ошибка при указании неправильного типа (например, число вместо строки).

Решение: использовать -h для проверки, проверять типы через type=int и т.д.

Как обработать простые аргументы без внешних библиотек?

Самый простой способ — использовать sys.argv. Этот список содержит все аргументы, переданные при запуске (первый элемент — имя скрипта).

import sys

if len(sys.argv) < 2:
    print('Ошибка: не указан аргумент')
    sys.exit(1)
arg = sys.argv[1]
print(f'Переданный аргумент: {arg}')

Запуск: python script.py hello

Проблемы и их решение:

  • IndexError: list index out of range — всегда проверять длину len(sys.argv).
  • Нет поддержки флагов или типов — для этого лучше использовать argparse.

Как использовать устаревший модуль getopt?

Модуль getopt предоставляет C-подобный интерфейс для разбора коротких и длинных опций.

import sys, getopt

def main(argv):
    inputfile = ''
    outputfile = ''
    try:
        opts, args = getopt.getopt(argv, 'hi:o:', ['help', 'input=', 'output='])
    except getopt.GetoptError:
        print('Ошибка опций')
        sys.exit(2)
    for opt, arg in opts:
        if opt in ('-h', '--help'):
            print('usage: script.py -i  -o ')
            sys.exit()
        elif opt in ('-i', '--input'):
            inputfile = arg
        elif opt in ('-o', '--output'):
            outputfile = arg
    print(f'Input: {inputfile}, Output: {outputfile}')

if __name__ == '__main__':
    main(sys.argv[1:])

Типичные ошибки:

  • Несоответствие спецификации опций — нужно правильно указывать двоеточие после короткой опции, если требуется аргумент.
  • Ошибка GetoptError при неверном формате.

Как передать аргументы через переменные окружения?

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

import os

def get_config():
    db_host = os.environ.get('DB_HOST', 'localhost')
    db_port = int(os.environ.get('DB_PORT', 5432))
    return db_host, db_port

host, port = get_config()
print(f'Подключение к {host}:{port}')

Запуск: DB_HOST=192.168.1.1 DB_PORT=3306 python script.py

Проблемы:

  • Если переменная не задана, может использоваться значение по умолчанию.
  • Ошибка при преобразовании типа (например, строка не число) — использовать try/except.

Расширенные примеры

Далее приведены более сложные сценарии использования аргументов в Python.

Использование подкоманд (subparsers)

Позволяет создавать многоуровневые интерфейсы, например, для CLI-инструментов.

Пример
import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command')

info_parser = subparsers.add_parser('info', help='Вывод информации')
info_parser.add_argument('file', help='Файл')

convert_parser = subparsers.add_parser('convert', help='Конвертация')
convert_parser.add_argument('--format', choices=['csv', 'json'], required=True)

args = parser.parse_args()
if args.command == 'info':
    print('Информация о файле:', args.file)
elif args.command == 'convert':
    print('Конвертация в формат:', args.format)
python script.py info data.txt
Информация о файле: data.txt

python script.py convert --format csv
Конвертация в формат: csv

Обработка аргументов через переменные окружения в сочетании с CLI

Пример скрипта, который принимает флаг --config или использует переменную CONFIG_PATH.

Пример
import argparse, os

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--config', help='Путь к конфигу')
    args = parser.parse_args()
    config_path = args.config or os.environ.get('CONFIG_PATH', './config.yaml')
    print(f'Используется конфиг: {config_path}')

if __name__ == '__main__':
    main()
python script.py --config /etc/myapp/config.yaml
Используется конфиг: /etc/myapp/config.yaml

CONFIG_PATH=/opt/config python script.py
Используется конфиг: /opt/config

Обработка позиционных аргументов с argparse и проверкой типа

Пример: скрипт ожидает целое число и строку.

Пример
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int, help='Количество')
parser.add_argument('name', help='Имя')
args = parser.parse_args()
print(f'Повторений: {args.count}, Имя: {args.name}')
for i in range(args.count):
    print(f'{i+1}: {args.name}')
python script.py 3 John
Повторений: 3, Имя: John
1: John
2: John
3: John

Использование sys.argv для разбора простого списка файлов

Пример: передача списка файлов через аргументы.

Пример
import sys

if len(sys.argv) < 2:
    print('Укажите хотя бы один файл')
    sys.exit(1)
files = sys.argv[1:]
for f in files:
    print(f'Обработка файла: {f}')
python script.py file1.txt file2.txt
Обработка файла: file1.txt
Обработка файла: file2.txt

Передача аргументов с помощью subprocess из другого скрипта

Пример: вызов внешнего скрипта с параметрами и получение вывода.

Пример
import subprocess

script = 'other_script.py'
args_list = [script, '--input', 'data.csv', '--output', 'result.json']
result = subprocess.run(['python'] + args_list, capture_output=True, text=True)
print('stdout:', result.stdout)
if result.returncode != 0:
    print('stderr:', result.stderr)

В other_script.py используется argparse для приема --input и --output.

Передача аргументов в Python скрипт - comments

En
Python run args (python)