Как сделать sys.аргументы argv необязательны? (Питон)

sys.argv принимает аргументы в командной строке оболочки при запуске программы. Как сделать эти аргументы необязательными?

Я знаю, что могу использовать try - except. Но это заставляет вас вставлять либо никаких дополнительных аргументов, либо все дополнительные аргументы, если вы не вложите больше try - except что делает код менее читаемым.

редактировать

предположим, мне понадобится следующая функциональность, как мне реализовать это?

$ python program.py add Peter 
'Peter' was added to the list of names.

этой

5 ответов


plac - это альтернатива стандартной библиотеки модулей даны ответы. Это позволяет определить аргументы командной строки через аннотации. Из документации exemple 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 exemple:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--add", help="Add prefix to string")
args = parser.parse_args()

обратите внимание, что Соглашение для необязательного аргумента должно быть предоставлено как "--add " while команды предлагаются как "добавить". Есть реализация подкоманды в argparse.


вы можете использовать более высокоуровневые библиотеки: argparse, optparse, opster. Все они поддерживают необязательные аргументы.


редактировать чтобы обратиться к вашему редактированию,

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

если преимущество требования "добавить" перед каждым именем заключается в том, что если есть какие-либо другие аргументы, которые вы хотите искать после добавления имен, вы можете. Если вы хотите передать несколько имен, сказав 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#optparse


вы должны использовать парсер командной строки, такой как getopt или argparse. Они позволяют определить необязательные параметры со значениями по умолчанию.


вы можете найти ответ, используя argparse здесь здесь. Решения с использованием getopt или opster будет проголосован как самый любимый ответ вместо этого.