Настройка запуска скриптов 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 Типичные ошибки:
- Несоответствие спецификации опций — нужно правильно указывать двоеточие после короткой опции, если требуется аргумент.
- Ошибка
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.