2015-06-12 3 views
3

У меня возникла проблема с моим первым функциональным скриптом python, который я пишу, полный рабочий отрывок приведен ниже.Почему мои getopts терпят неудачу, если я укажу имя пользователя?

Моя проблема заключается в том, что если я включаю параметр командной строки имени пользователя (или --username), он всегда пуст и испортит другие аргументы командной строки.

Например, если я бегу это с аргументами командной строки -n tdelane -s 10.1.213.226 -p xxx -v, я получу это как выход:

cliloc = /usr/local/bin/cli 
server = 
username = Administrator 
password = 
verbose = True 
o = -n 
a = 
cliloc = /usr/local/bin/cli 
server = 
username = 
password = 
verbose = True 

Как вы можете видеть, как только он попадает в -n, он не только устанавливает его ничего, кроме этого, также не обрабатывает ничего другого. Если я возьму -n, это сработает. Бег с -s 10.1.213.226 -p xxx -v это выход:

cliloc = /usr/local/bin/cli 
server = 
username = Administrator 
password = 
verbose = True 
o = -s 
a = 10.1.213.226 
o = -p 
a = xxx 
o = -v 
a = 
cliloc = /usr/local/bin/cli 
server = 10.1.213.226 
username = Administrator 
password = xxx 
verbose = True 

Вот часть этого сценария, который имеет отношение:

import subprocess, getopt, sys, re 

try: 
    opts, args = getopt.getopt(sys.argv[1:], "cs:np:hv",     
     ["cli", "server", "username", "password", "help", "verbose"]) 

except getopt.GetoptError as err: 
    print str(err) 
    usage() 
    sys.exit(2) 

cliloc = '/usr/local/bin/cli' 
server = '' 
username = 'Administrator' 
password = '' 
verbose = True 

if verbose: 
    print "cliloc = %s" % (cliloc) 
    print "server = %s" % (server) 
    print "username = %s" % (username) 
    print "password = %s" % (password) 
    print "verbose = %s" % (verbose) 

for o, a in opts: 
    if verbose: 
     print 'o = ' + o 
     print 'a = ' + a 
    if o == "-v": 
     verbose = True 
    elif o in ("-h", "--help"): 
     usage() 
     sys.exit() 
    elif o in ("-c", "--cli"): 
     cliloc = a 
    elif o in ("-s", "--server"): 
     server = a 
    elif o in ("-n", "--username"): 
     username = a 
    elif o in ("-p", "--password"): 
     password = a 
    else: 
     assert False, "unhandled option" 

if verbose: 
    print "cliloc = %s" % (cliloc) 
    print "server = %s" % (server) 
    print "username = %s" % (username) 
    print "password = %s" % (password) 
    print "verbose = %s" % (verbose) 

Заранее спасибо!

ответ

3

Вы сконфигурировали -n, чтобы не принимать аргументы; нет нет : после него:

opts, args = getopt.getopt(sys.argv[1:], "cs:np:hv", 
#           ^no colon after this option     
    ["cli", "server", "username", "password", "help", "verbose"]) 

Добавить двоеточие:

opts, args = getopt.getopt(sys.argv[1:], "cs:n:p:hv",     
#           ^insert colon here 
    ["cli", "server", "username", "password", "help", "verbose"]) 

С толстой кишки библиотека знает, искать аргумент и tdelane не в конечном итоге толкает все в список неанализируемого опций :

>>> import getopt 
>>> import shlex 
>>> args = shlex.split('-n tdelane -s 10.1.213.226 -p xxx -v') 
>>> getopt.getopt(args, "cs:np:hv") 
([('-n', '')], ['tdelane', '-s', '10.1.213.226', '-p', 'xxx', '-v']) 
>>> getopt.getopt(args, "cs:n:p:hv") 
([('-n', 'tdelane'), ('-s', '10.1.213.226'), ('-p', 'xxx'), ('-v', '')], []) 

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

+0

Спасибо за ответ и отзыв! В моем чтении я подумал, что толстая кишка сделала выбор подходящим вариантом. Я рассмотрю модуль 'argparse'. Еще раз спасибо! –

+0

Я нашел хорошую причину, почему бы не использовать argparse ... этот скрипт будет работать во многих системах, где python 2.7+ недоступен, и установить модули python также невозможно. –

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