У меня возникла проблема с моим первым функциональным скриптом 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)
Заранее спасибо!
Спасибо за ответ и отзыв! В моем чтении я подумал, что толстая кишка сделала выбор подходящим вариантом. Я рассмотрю модуль 'argparse'. Еще раз спасибо! –
Я нашел хорошую причину, почему бы не использовать argparse ... этот скрипт будет работать во многих системах, где python 2.7+ недоступен, и установить модули python также невозможно. –