Я хочу проверить, действительно ли аргумент был передан в командной строке, когда для этого аргумента есть значение по умолчанию.
Конкретно в моем случае я использую SCons, а scons имеет класс, который наследуется от optparse питонов. Итак, мой код такой:
from SCons.Environment import Environment
from SCons.Script.SConsOptions import Parser
MAIN_ENV = Environment()
argparser = Parser(MAIN_ENV._get_major_minor_revision(SCons.__version__))
print(argparser.parse_args())
Который печатает все аргументы со значениями, но я не могу сказать, был ли установлен один из аргументов или просто установлено значение по умолчанию. В этом случае я смотрю на SCons параметр 'num_jobs', который по умолчанию равен 1. Я хотел бы проверить, предоставил ли пользователь значение num_jobs, и использовать его, если это так, или просто установить num_jobs в число процессоров, сообщаемых система.
Я могу использовать sys.argv следующим образом, но я бы предпочел более чистый вариант, используя парсер параметров:
###################################################
# Determine number of Jobs
# start by assuming num_jobs was not set
NUM_JOBS_SET = False
if GetOption("num_jobs") == 1:
# if num_jobs is the default we need to check sys.argv
# to see if the user happened to set the default
for arg in sys.argv:
if arg.startswith("-j") or arg.startswith("--jobs"):
if arg == "-j" or arg == "--jobs":
if(int(sys.argv[sys.argv.index(arg)+1]) == 1):
NUM_JOBS_SET = True
else:
if arg.startswith("-j"):
if(int(arg[2:]) == 1):
NUM_JOBS_SET = True
else:
# user must have set something if it wasn't default
NUM_JOBS_SET = True
# num_jobs wasn't specificed so let use the
# max number since the user doesn't seem to care
if not NUM_JOBS_SET:
NUM_CPUS = get_num_cpus()
print("Building with " + str(NUM_CPUS) + " parallel jobs")
MAIN_ENV.SetOption("num_jobs", NUM_CPUS)
else:
# user wants a certain number of jobs so do that
print("Building with " + str(GetOption('num_jobs')) + " parallel jobs")
Я пытался использовать pythons OptionParser, но если я вызываю parse_args () из OptionParser из python внутри скрипта scons, парсер SCons, похоже, не работает, он не может распознать действительные опции.
Если у кого-то есть пример того, как проверить, был ли передан аргумент arg только с помощью optparse для pythons, этого должно быть достаточно для работы с парсером опции scons.