Как я могу создать команду с аргументами и файлом конфигурации?
Непосредственно к сути, я хочу дать пользователю гибкость в передаче аргументов в команду, чтобы контролировать, как команды должны выполняться, что-то вроде:
pcap -d 30 -w 2
Другими словами:
Я хочу сделать команду, которая выглядит точно так же, как команды Linux. Команда, которая работает точно так же, как команды Linux. Команда, имеющая параметры (т.е. аргументы) в том же стиле, что и команды Linux.
Я хочу создать команду, которая работает, принимая аргументы от пользователя или используя его аргументы по умолчанию (считанные из файла конфигурации) на случай, если пользователь не предоставит никаких аргументов, точно так же, как любые другие команды Linux.
Команда с --help, которая показывает различные параметры.
Я знаю, как сделать команду в Linux. Но я не знаю, как сделать эти параметры (аргументы команды). Я не знаю, как запрограммированы эти аргументы.
руководство, учебник или пример сделают
Примечание:
- Извиняюсь, если этот вопрос задан в неправильном стеке.
- Также извиняюсь за предыдущий вариант вопроса, он был плохо сформулирован.
3 ответа
Поскольку вы упоминаете python
, ответ питона:
если вы просто хотите установить значение по умолчанию для аргумента, вы можете просто установить значение по умолчанию для функции:
def show(val = 30):
print(val)
# to print the default value (30)
show()
# to show another value (e.g. 40)
show(40)
Другими словами, это напечатает значение по умолчанию, если вы не дадите аргумента, в то время как оно использует аргумент, если вы дадите его
Более продвинутый; чтение значений по умолчанию из файла с возможностью отмены путем предоставления аргументов
То же самое можно сделать, но читая аргументы по умолчанию из файла. Это даст возможность устанавливать аргументы в файле настроек, а не редактировать их в самом коде.
Допустим, у меня есть файл настроек, testconf.txt
:
length:4
height:7
width:6
... и я хочу прочитать эти значения в моем приложении в качестве аргументов по умолчанию, но пользователь может отменить их с помощью пользовательских аргументов:
#!/usr/bin/env python3
import sys
# path to my config file
conf_file = "/home/jacob/Bureaublad/testconf.txt"
# read the default arguments from a file
def_args = [l.strip() for l in open(conf_file).readlines()]
# replace default args by possible custom args
cust_args = sys.argv[1:]
for cu in cust_args:
argname = cu.split(":")[0]
try:
match = [arg for arg in def_args if arg.startswith(argname)][0]
except IndexError:
print("incorrect argument: ", cu)
else:
def_args[def_args.index(match)] = cu
def get_arg(s):
return [val.split(":")[1] for val in def_args if val.startswith(s)][0]
l = get_arg("length")
w = get_arg("width")
h = get_arg("height")
print("l=", l, "w=", w, "h=", h)
Теперь я могу запустить скрипт без аргументов:
$ '/home/jacob/Bureaublad/pscript_4.py'
l= 4 w= 6 h= 7
Или аргументы ширины:
$ '/home/jacob/Bureaublad/pscript_4.py' length:10 height:456
l= 10 w= 6 h= 456
Порядок данных аргументов в этой настройке не имеет значения. В случае неверного аргумента:
$ '/home/jacob/Bureaublad/pscript_4.py' monkey
incorrect argument: monkey
l= 4 w= 6 h= 7
Заметка
В "реальном" программном обеспечении вы можете (и должны) сделать его более совершенным, добавив предупреждение, если файл настроек неверен или отсутствует, решите, что делать дальше, но это основная идея.
РЕДАКТИРОВАТЬ
Из ваших комментариев я понимаю, что в двух отношениях приведенный выше ответ не является (пока) тем, что вы ищете:
- Вы хотели бы выполнить команду без пути к исполняемому файлу (сценарию) и его расширению, и
- Вы хотели бы иметь более "обычный" формат опций.
Хотя [1]
ответ уже в другом месте, я приведу краткое объяснение здесь:
1. Запустите команду без пути и расширения
Вы можете запускать исполняемые файлы и сценарии без указания пути к сценарию, делая его исполняемым (chmod +x <files>
) и поместите их где угодно в $ PATH.
В Linux расширение (.py
) не играет никакой роли, поэтому вы все равно можете использовать скрипт без расширения.
Чтобы быть конкретным:
- создать, если он еще не существует, каталог
~/bin
создайте и сохраните сценарий, как указано в исходном ответе, как
showsize
(без расширения) в~/bin
и сделайте скрипт исполняемым.После выхода из системы вы можете просто запустить скрипт командой:
showsize
2. Измените формат опций
Как уже упоминалось, вы можете легко изменить формат параметров, например: для анализа параметров, например:
-l 23 -h 210 -w 321
Если вы включите в сценарий:
args = sys.argv [1:]
Результат для
args
будет список:["-l", "23", "-h", "210", "-w", "321"]
Теперь, что нам нужно сделать, чтобы получить значение
-h
просто посмотрите на индекс-h
и выберите первый следующий элемент в списке:height = args[args.index("-h")+1] print(height) > 210
в скрипте:
#!/usr/bin/env python3 import sys # path to my config file conf_file = "/home/jacob/Bureaublad/testconf.txt" # read the default arguments from a file def_args = [l.strip().split(":") for l in open(conf_file).readlines()] # replace default args by possible custom args cust_args = sys.argv[1:] for carg in cust_args: if carg in ["-l", "-h", "-w"]: for d in def_args: d[1] = cust_args[cust_args.index(carg)+1] if d[0] == carg else d[1] def get_arg(s): # fetch values from the list return [val[1] for val in def_args if val[0] == s][0] l = get_arg("-l") w = get_arg("-w") h = get_arg("-h") print("length =", l, "\nwidth =", w, "\nheight =", h)
Как пользоваться
Создайте файл настроек в формате:
-l:4 -h:7 -w:6
Скопируйте скрипт в пустой файл, сваи его как
showsize
(без расширения) в~/bin
или где-нибудь еще в$PATH
и сделайте его исполняемым.В разделе заголовка скрипта укажите путь к файлу настроек:
# path to my config file conf_file = "/home/jacob/Bureaublad/testconf.txt"
Теперь запустите команду:
$ showsize length = 4 width = 6 height = 7
Или же:
$ showsize -l 300 -h 345 -w 751 length = 300 width = 751 height = 345
Файл сценария:
#!/bin/bash
# set default values
X=10
Y="lorem ipsum"
source ~/.myscript.conf
echo "X = $X, Y = $Y"
Файл.myscript.conf:
X=20
Y="something else"
Теперь, если пользователь запускает файл сценария и не имеет файла.myscript.conf в своем домашнем каталоге, сценарий будет использовать X=10 и Y="lorem ipsum", если есть файл конфигурации, он будет использовать значения из файла.
Исходная команда выполняет содержимое файла, заданного в качестве аргумента в текущей оболочке, поэтому здесь она присваивает новые значения значениям X и Y, перезаписывающим значения по умолчанию из файла сценария.
Поскольку ~ указывает на домашний каталог пользователя, эта настройка будет работать для любого пользователя в вашей системе (в том числе root).
[Edit] И в вашем конкретном примере:
#!/bin/bash
X=10
Y=2
source ~/.config.conf
pcap -d $X -w $Y
Bash: то же самое, что и у Марека с поиском файла с пользовательскими значениями, с оговоркой, что этот файл может делать что угодно, и опечатки будут просто вызывать синтаксические ошибки, так что это требует немного знаний пользователя. Вы можете анализировать параметры командной строки с помощью getopts.
Python: см. Модуль argparse для разбора параметров командной строки и ConfigParser(v2) и configparser(v3) для разбора файла.ini.
Обычно вы используете файл конфигурации для вещей, которые не часто меняются, и параметры командной строки для вещей, которые, вероятно, различаются при каждом запуске. Редактирование файла конфигурации при каждом запуске - это PITA.