Как запустить python скрипт с параметрами
Перейти к содержимому

Как запустить python скрипт с параметрами

  • автор:

Запуск python скрипта с параметрами из bash

Добрейшего дня! Трабл. Есть скрипт ip-up, который отрабатывает при подключении pptp-клиента. Есть скрипт, назову его условно connect, которому передаются параметры от ip-up. Скрипты на bash. Все прекрасно работает. Возникла необходимость переписать bash-скрипт на python3. Скрипт умеет принимать параметры. Проблем тут нет. Проблема возникает когда, я пытаюсь передать параметры от ip-up. То есть connect(bash) принимает параметры, а connect(python) не воспринимает их. Если запускаю вручную в терминале (debian 8):

python3 ./connect.py parametr1 parametr2 parametr3 

Все четко. Добавил в код вывод значений передаваемых параметров в файл. Все красиво выводится. Вывод: скрпт работает. Ок! В скрипте ip-up добавляю строку на запуск моего скрипта. Вангую гневные комменты. Да, я знаю, есть папочка ip-up.d. Оттуда скрипты запускаются сами при коннекте. В данном случае не принципиально. На bash скрипт прекрасно запускался и путем прописывания команды на его запуск прямо в ip-up скрипте с параметрами. Дак вот, подшаманил скрипт на питоне, чтобы тот признаки жизни подавал при старте и получается картина такая. Клиент подключается -> стартует ip-up и запускает скрипт python c параметрами-> стартует скрипт python, доходит до места где параметры заносятся в переменные и встает. Повторюсь, ip-up скрипт точно передает параметры. Проверено на другом принимающем их скрипте, но на bash. Python-скрипт понимает параметры. При ручном запуске скрипта, он успешно отрабатывает. Проблема, что автоматически эта конструкция не работает у меня. Есть идеи? Спасибо!

kerby ★
14.08.17 14:50:04 MSK

Разбор параметров командной строки в Python

Разбор параметров командной строки в Python

При создании консольных программ в Python очень часто необходимо разобрать параметры (аргументы) передаваемые через командную строку, это можно сделать используя переменную argv из модуля sys, а так же с помощью модуля argparse из стандартной библиотеки Pyhton.

Второй способ более предпочтительный и удобный, далее ему мы уделим больше внимания.

Статья ниже не является полным описание всех возможностей модуля argparse, это просто общий обзор.

Ниже я иногда пишу аргументы командной строки, иногда параметры командной строки… Имеется ввиду одно и тоже ��

Получение параметров без использования argparse

Например, мы хотим написать программу после запуска выводящую в консоль «Привет ». Имя мы будем передавать через параметр в командной строке, далее его нужно получить в нашей программе. Как это сделать?

Мы можем сделать это используя стандартный модуль sys и его переменную argv, она содержит список переданных параметров (нулевой элемент списка содержит имя нашего скрипта).

Другими словами, чтобы вывести имя, которое мы передаем аргументом, необходимо обратиться к sys.argv[1]:

import sys print(f'Привет ')

Сохраним код в файле hello.py и запустим его с параметром «Александр» (аргументом):

python hello.py Александр

Но если попытаться запустить скрипт без параметра, то получаем ошибку поскольку в списке нет элемента с индексом 1. Исправим это сделав проверку на наличии передаваемого параметра и если он не передается, будет выводиться «Привет мир!»

import sys if len(sys.argv) == 1: print('Привет мир!') else: print(f'Привет ') 

Теперь немного усложним задачу, что если мы хотим передавать имя с помощью именованного параметра —name, доработаем наш код:

import sys if len(sys.argv) == 1: print('Привет мир!') else: p_name = sys.argv[1] p_value = sys.argv[2] if p_name == '--name': print(f'Привет ') else: print(f'Неизвесный параметр ') 

Запустив скрипт таким образом:

python hello.py —name Александр

Получаем нужный результат, если в место «—name» передать другое значение, то получаем предупреждение.

Но, если мы передадим один параметр вместо двух, то скрипт не запуститься, нам необходимо добавить еще один if для проверки существование минимум двух параметров.

А если нам нужно добавить еще несколько параметров, а если не все из них обязательные… короче код начнется превращаться в ужас, вот здесь нам на помощь и придет модуль argparse стандартной питоновской библиотеки.

Использование модуля argparse

Этот модуль облегчит нам разбор и дальнейшее использование передаваемых скрипту аргументов из командной строки.

Начнем переписывать наш пример:

import argparse parser = argparse.ArgumentParser() parser.add_argument('name', nargs='?', default='мир!') args = parser.parse_args() print(f'Привет ') 

Сохраним код в новый файл hello2.py и выполним передав ему в качестве параметра «Александр»:

python hello2.py Александр

Мы получим то, что требовалось:

Разберем подробнее строку:

parser.add_argument(‘name’, nargs=’?’, default=’мир!’)

В ней мы с помощью метода add_argument и передаваемых ему параметров, задали необязательный (для этого указали nargs=’?’) позиционный аргумент. Если аргумент не передается, то он принимает значение указанное в default.

Важно помнить, что при позиционных аргументах важен их порядок в момент, когда мы вызываем скрипт. Первый аргумент, переданный скрипту, становится первым позиционным аргументом, второй аргумент — вторым позиционным аргументом и т.д.

Продолжим доработку кода. Теперь мы хотим, чтобы Имя передавалось именованным параметром —name

Для этого всего лишь надо изменить одну строку создания аргумента

Теперь можно запустить скрипт с именованным параметром —name:

python hello2.py —name Александр

Мы получим «Привет Александр», а при отсутствии параметра, будет выводится значение по умолчанию «Привет мир».

У названия параметра может быть краткая форма, она записывается с одним ««, например:

parser.add_argument(‘-n’, ‘—name’, default=’мир!’)

А что если в качестве параметра —name мы заходим передать Имя + Фамилия?

python hello2.py —name Александр Третьяков

Выполнив это сейчас мы получим ошибку error: unrecognized arguments: Третьяков поскольку модуль argparse решил что фамилия это отдельный аргумент.

Чтобы поправить ситуацию, используем дополнительный параметр метода add_argument — nargs со значением «+», который обозначает, что мы ожидаем одно или более значений аргумента.

Теперь повторно вызвав скрипт, получим все переданные параметры в виде списка:

Привет [‘Александр’, ‘Третьяков’]

Выбор агрументов из определенных вариантов

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

Если брать наш пример выше, можем добавить, чтобы скрипт принимал только определенные имена: Александр, Екатерина, Татьяна, Евгений. Для этого добавим в метод add_argument параметр choices, в котором укажем список возможных значений параметра (в нашем случае список имен).

parser.add_argument (‘-n’, ‘—name’, choices=[‘Александр’, ‘Екатерина’, ‘Татьяна’, ‘Евгений’])

Теперь при вызове скрипта мы должны обязательно указать параметр —name со значением из этого списка иначе возникнет ошибка:

python hello2.py —name Екатерина

А если попробуем передать имя не из одобренного списка:

hello2.py —name Ольга

hello2.py: error: argument -n/—name: invalid choice: ‘Ольга’ (choose from ‘Александр’, ‘Екатерина’, ‘Татьяна’, ‘Евгений’)

Справка (помощь) по аргументам

Выше мы ограничили список возможных значений аргумента —name четырьмя именами, но как узнать об этом пользователю, который в первый раз использует скрипт, ему придаться вчитываться в текст ошибки, чтобы понять чего от него хочет программа. Как пользователю узнать о всех возможных аргументах, порядке их применения и их назначении?

Для этого мы можем оформить справку для программы, которая будет вызываться аргументом —help или -h. В справочной информации мы сможем указать название и версию программы, копирайт, описание того, что она делает, и список ожидаемых параметров.

Итак изменим 2 строчки нашего кода, добавив в него справочную информацию:

parser = argparse.ArgumentParser( prog='Greeting Script', description='Программа, которая говорит "Привет"', epilog='(c) Информация об авторе программы' ) parser.add_argument ('-n', '--name', choices=['Александр', 'Екатерина', 'Татьяна', 'Евгений'], help='Список из имен, которые я могу приветствовать') 

python hello2.py —help

Мы получим справку о нашей программе:

usage: Greeting Script [-h] [-n ] Программа, которая говорит "Привет" optional arguments: -h, --help show this help message and exit -n , --name Список из имен, которые я могу приветствовать (c) Информация об авторе программы 

Аргументы как флаги

А что если мы хотим сделать так, чтобы при указании флага -bye программа говорила нам «До свидания»?

Для этого добавим строку:

parser.add_argument (‘-bye’, action=’store_const’, const=True, help=’Установите, если нужно ли прощаться с пользователем’)

В метод add_argument мы добавили 2 новых параметра. Первый — action, он предназначен для выполнения некоторых действий над значениями переданного аргумента. В нашем случае мы передали значение параметра action — store_const, оно обозначает, что если данный аргумент (‘-bye’) указан, то он всегда будет принимать значение, указанное в другом параметре метода add_argument — const. А если аргумент передан не будет, то его значение будет равно None.

Так же в конце скрипта добавим вывод «До свидания», в случае установленного флага -bye:

if args.bye: print ('До свидания')

Теперь если добавить флаг -bye при вызове скрипта:

python hello2.py —name Александр -bye

Привет Александр До свидания

Без добавления -bye мы получим просто:

Флаги со значениями True и False используются часто, поэтому для этих целей предусмотрено 2 специальных значения для параметра action: store_true и store_false.

Можно переписать наш код так:

parser.add_argument (‘-bye’, action=’store_true’, help=’Установите, если нужно ли прощаться с пользователем’)

Мы использовали store_true, т.е. если параметр ‘-bye’ передан, он примет значение True.

Кстати, выше мы увидели что для добавление второго, третьего и т.д. аргумента, нам нужно просто еще раз вызвать метод add_argument и передать ему значения параметра.

Окончательный код нашего файла hello2.py:

import argparse parser = argparse.ArgumentParser( prog='Greeting Script', description='Программа, которая говорит "Привет"', epilog='(c) Информация об авторе программы' ) parser.add_argument ('-n', '--name', choices=['Александр', 'Екатерина', 'Татьяна', 'Евгений'], help='Список из имен, которые я могу приветствовать') parser.add_argument ('-bye', action='store_true', help='Установите, если нужно ли прощаться с пользователем') args = parser.parse_args() print(f'Привет ') if args.bye: print ('До свидания') 

На этом все, думаю общее представление о модуле argsparse вы получили, подробнее о нем можно почитать в официальной документации https://docs.python.org/3/library/argparse.html.

Категории

Свежие записи

  • Таблицы в админке WordPress (часть 1)
  • Импорт/экспорт Linux WSL
  • Не печатаются заглавные буквы в PowerShell
  • 1С-Битрикс: Ошибка авторизации! Срок действия пароля истек, необходимо сменить пароль.
  • Несколько конфигураций для проекта Django
  • Django inclusion_tag с разными шаблонами

Передача параметров в скрипт Python из командной строки.

При запуске скриптов, часто требуется указать какие-то дополнительные параметры, которые будут использованы в ходе работы программы. Конечно, можно при помощи функции input() получить данные от пользователя и сохранить их в переменных. Как говорится, дело вкуса. Но вместо множественного вызова функции input() есть намного более элегантное решение. Это передача параметров в скрипт python, непосредственно в командной строке — в момент вызова программы. Как это сделать? Давайте разберемся.

Для начала, наберите небольшую программу в своем редакторе. Сохраните её в папке C:\PyScript под именем input_var.py. Разумеется, папку и файл можете назвать как угодно, но тогда не забудьте указать свои данные при вызове скрипта в командной строке.

1. #-*- coding: UTF-8 -*- 2. from sys import argv 3. 4. script, first, second, third = argv 5. 6. print ("Этот скрипт называется: ", script) 7. print ("Значение первой переменной: ", first) 8. print ("Значение второй переменной: ", second) 9. print ("Значение третьей переменной: ", third)

Как видите, программа очень маленькая. Но её вполне хватит для демонстрации способа передачи данных в скрипт. После того, как следуя приведенным выше инструкциям, вы набрали и сохранили программу, вызовите командную строку Windows. После этого укажите имя интерпретатора python, путь к вызываемому файлу и три значения, разделяя все пробелами, как на рисунке ниже:

Передача данных в скрипт Python

Рис. 1 Передача данных в скрипт Python

Если у вас скрипт хранится в другой папке — укажите свой путь к нему. После этого нажмите клавишу Enter на клавиатуре. В результате вы должны увидеть следующее:

Передача данных в скрипт Python

Рис. 2 Результат выполнения программы

А теперь давайте разберем, как же это все работает.

Во второй строке мы импортируем argv из модуля sys. Во многих языках переменных argv — стандартное имя. В этой переменной хранятся данных, которые вы передаете сценарию. Пока нам достаточно знать, что эта переменная работает как «контейнер», в котором мы можем передать данные скрипту.

В четвертой строке мы производим «распаковку» содержимого argv в переменные. Слово «распаковка» может показаться странным, но в данном случае оно наиболее подходит. Фактически, мы сообщаем интерпретатору Python, что он должен взять данные из argv и последовательно поместить их в переменные, которые мы указали с левой стороны. После этого мы можем работать с ними как с обычными переменными, которым присвоили значения.

Вы можете указать свои значения вместо «15 два 105», но число значений, которые вы передаете скрипту, должно строго соответствовать количеству переменных, в которые «распаковывается» содержимое argv. Иначе вы увидите сообщение об ошибке:

Передача данных в скрипт python

Рис. 3 Ошибка распаковки данных.

Это сообщение возникло потому что мы передали в скрипт Python недостаточно данных. Если конкретнее, то строка ValueError прямо сообщает, что необходимо 4 значения, но указано 3 (имя скрипта передается автоматически).

Не забывайте, что все данные, которые мы передаем в программу python являются строковыми значениями. Поэтому параметры «10» и «105» сначала необходимо преобразовать в числовой тип при помощи функции int(), а только потом использовать в математических операциях. Будьте внимательны!

Как в скрипт python принять параметры

может кто даст коротенький примерчик. что должно быть прописано в скрипте python что бы он принял параметр «из вне».
прочитал что как бы def , опробовал не получилось.

Отслеживать
задан 15 июл 2013 в 6:36
151 3 3 золотых знака 3 3 серебряных знака 11 11 бронзовых знаков

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

sys.argv is a list in Python, which contains the command-line arguments passed to the script.

With the len(sys.argv) function you can count the number of arguments.

If you are gonna work with command line arguments, you probably want to use sys.argv.

To use sys.argv, you will first have to import the sys module.

Отслеживать
ответ дан 15 июл 2013 в 6:42
957 11 11 серебряных знаков 19 19 бронзовых знаков

В стандартной библиотеке питона есть модуль argparse

import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers)) 

Если пример выше сохранить под именем prog.py и запустить, получим:

$ python prog.py -h usage: prog.py [-h] [--sum] N [N . ] Process some integers. positional arguments: N an integer for the accumulator optional arguments: -h, --help show this help message and exit --sum sum the integers (default: find the max) 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *