2015-09-04 5 views
1

Я изучал немного Python, и я наткнулся на модуль getopt для анализа аргументов командной строки.Несколько аргументов командной строки

В принципе, у меня есть следующий код:

import sys, getopt 

print("The list of %s arguments passed:" % len(sys.argv)) 

# Print each argument 
for arg in sys.argv: 
    print(arg) 
print() 

# Now print parsed arguments 
opts, args = getopt.getopt(sys.argv[1:], "ab:cd", ["arbitrary", "balance=", "cite"]) 
for opt in opts: 
    print(opt) 
print() 

# Print the arguments returned 
print(args) 

Однако мне нужно -b возможность взять два различных аргумента, например -b one two. Я попытался положить два двоеточия после b в список аргументов getopt, но это не сработало.

Если кто-то может сказать мне, как это сделать, используя модуль getopt и отправьте примеры, это было бы очень полезно!

+2

Обратите внимание, что 'getopt' устарел; используйте гораздо более универсальный ['argparse' module] (https://docs.python.org/2/library/argparse.html). Он поддерживает несколько значений для каждого параметра. –

+1

Связанное чтение - [PEP 0389] (https://www.python.org/dev/peps/pep-0389/), в котором упоминается [обесценение 'optparse'] (https://www.python.org/dev/peps/pep-0389/# deprecation-of-optparse) и [de-подчеркнуто 'getopt'] (https://www.python.org/dev/peps/pep-0389/#updates-to-getopt-documentation) –

+0

использовать 'argparse' и окружать аргумент двойными кавычками' -b "аргументом с пробелами" ' –

ответ

1

Забудьте Getopt, используйте Docopt (на самом деле):

Если я правильно понимаю, вы хотите пользователю передать 2 аргумента для уравновешивания. Это может быть достигнуто путем:

doc = """Usage: 
    test.py balance= <b1> <b2> 
    test.py 
""" 

from docopt import docopt 

options, arguments = docopt(__doc__) # parse arguments based on docstring above 

Эта программа принимает: test.py balance= X Y, или без каких-либо аргументов.

Теперь, если мы добавим «цитировать» и «» произвольные варианты, это должно дать нам:

doc = """ 
Usage: 
    test.py balance= <b1> <b2> 
    test.py 

Options: 
    --cite -c   Cite option 
    --arbitrary -a  Arbitrary option 
""" 

Программа теперь принимает параметры. Пример:

test.py balance= 3 4 --cite 

=> options = { 
    "--arbitrary": false, 
    "--cite": true, 
    "<b1>": "3", 
    "<b2>": "4", 
    "balance=": true 
} 

наконечник: кроме того, вы можете test your documentation string directly in your browser, прежде чем использовать его в коде.

Life saver!

+2

Пожалуйста, отправьте код, который решает проблему * актуальной *. –

+0

Хороший вопрос @ KarolyHorvath, я отредактирую свое сообщение – brunetton

+0

Я сейчас изучаю модуль argparse, я посмотрю на модуль docopt, как только я пойму argparse. Какой из них должен быть лучше/проще? argparse или docopt? –

Смежные вопросы