Как сделать аргументы sys.argv необязательными? (Python)
sys.argv
принимает аргументы в командной строке оболочки при запуске программы. Как я могу сделать эти аргументы необязательными?
Я знаю, что могу использовать try
- except
, Но это вынуждает вас вводить либо никаких дополнительных аргументов, либо всех дополнительных аргументов, если вы не вкладываете больше try
- except
что делает код выглядит гораздо менее читабельным.
редактировать
Предположим, я хотел бы следующую функциональность, как мне это реализовать?
$ python program.py add Peter
'Peter' was added to the list of names.
это add
аргумент (а не --add
) необязательно так, что
$ python program.py
просто запускает программу нормально.
5 ответов
plac - это альтернатива стандартным библиотечным модулям, приведенным в других ответах. Это позволяет определять аргументы командной строки через аннотации. Из документации пример 8 демонстрирует синтаксис необязательных аргументов:
example8.py
def main(command: ("SQL query", 'option', 'q'), dsn):
if command:
print('executing %s on %s' % (command, dsn))
# ...
if __name__ == '__main__':
import plac; plac.call(main)
Argparse пример:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--add", help="Add prefix to string")
args = parser.parse_args()
Обратите внимание, что в соглашении необязательный аргумент указывается как "--add", а подкоманды - как "добавить". В argparse есть реализация подкоманды.
РЕДАКТИРОВАТЬ, чтобы обратиться к вашему редактированию,
import sys
sys.argv = sys.argv[1:]
names = []
while sys.argv and sys.argv[0] == 'add':
#while the list is not empty and there is a name to add
names.append(sys.argv[1])
print sys.argv[1], 'was added to the list of names.'
sys.argv = sys.argv[2:]
все следующие работы с этим
$ python program.py add Peter
Peter was added to the list of names.
$ python program.py add Peter add Jane
Peter was added to the list of names.
Jane was added to the list of names.
$ python program.py
Если преимущество добавления "add" перед каждым именем состоит в том, что если есть какие-либо другие аргументы, которые вы хотите искать после добавления имен, вы можете это сделать. Если вы хотите передать несколько имен, говоря python program.py add Peter Jane
это можно сделать с довольно простым изменением
import sys
names = []
if len(sys.argv) > 2 and sys.argv[1] == 'add':
names = sys.argv[2:]
for n in names:
print n, 'was added to the list of names.'
ОРИГИНАЛ
Похоже, что вам будет лучше с чем-то вроде optparse. Однако так как sys.argv
это список, вы можете проверить его длину.
arg1 = sys.argv[1] if len(sys.argv) > 1 else 0 # replace 0 with whatever default you want
arg2 = sys.argv[2] if len(sys.argv) > 2 else 0
а затем используйте arg1 и arg2 в качестве "необязательных" аргументов командной строки. это позволит вам передавать 1, 2 или 0 аргументов командной строки (на самом деле вы можете передать более 2, и они будут игнорироваться). это также предполагает, что аргументы имеют известный порядок, если вы хотите использовать такие флаги, как -a
за которым следует значение, посмотрите на optparse http://docs.python.org/library/optparse.html?highlight=optparse
Вы должны использовать парсер командной строки, такой как getopt или argparse. Они позволяют вам определять опции, которые являются необязательными и имеют значения по умолчанию.
В качестве простого ответа на ваш вопрос вы можете указать необязательный аргумент с помощью sys.argv
, но если вы предвидите, что ваш модуль будет сильно расширяться, вы можете рассмотреть другой модуль, например argparse
как предложено в другом месте.
Это не проигнорирует никакие аргументы, но разрешит произвольное количество аргументов после этого.
#!/usr/bin/env python
import sys
added = sys.argv[1:]
if added:
for add in added:
print("{0} was added to the list of names.".format(add))
$ ./test.py
$ ./test.py Peter
Peter was added to the list of names.
Конечно ты не проходишь add Peter
просто Peter
. Но если это приемлемо, то это работает.
Я хочу сказать, что вы можете использовать необязательные аргументы с помощью sys
, и на самом деле для очень простых скриптов часто нет необходимости использовать argparse
если этого достаточно!
Вы можете найти ответ, используя argparse
здесь здесь Решения, использующие getopt
или же opster
будет выбран как наиболее понравившийся ответ вместо этого.