首页 > 解决方案 > 在使用 python optparse 设置默认值时检查是否传递了 arg

问题描述

当该参数有默认值时,我想检查该参数是否实际在命令行上传递。

特别是在我的情况下,我使用的是 SCons,并且 scons 有一个继承自 pythons 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 设置为报告的 CPU 数量系统。

我可以像这样使用 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,但是如果我从 scons 脚本中的 python 的 OptionParser 调用 parse_args(),SCons 解析器似乎不起作用,它无法识别有效选项。

如果有人有一个如何检查 arg 是否仅使用 pythons optparse 传递的示例,那应该足以让我使用 scons 选项解析器。

标签: pythoncommand-linebuildargumentsscons

解决方案


从评论中链接的这个问题:How to know if optparse option was pass in the command line or as a default

我可以在 SCons 中将其用于我的案例:

from SCons.Environment import Environment
from SCons.Script.SConsOptions import Parser

###################################################
# Determine number of Jobs
# start by assuming num_jobs was not set
opts_no_defaults = optparse.Values()
parser = Parser(MAIN_ENV._get_major_minor_revision(SCons.__version__))
__, args = parser.parse_args(values=opts_no_defaults)
opts = optparse.Values(parser.get_default_values().__dict__)
opts._update_careful(opts_no_defaults.__dict__)

# num_jobs wasn't specificed so let use the
# max number since the user doesn't seem to care
if not hasattr(opts_no_defaults, parser.get_option('--jobs').dest):
    NUM_CPUS = get_num_cpus()
    ColorPrinter().InfoPrint("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
    ColorPrinter().InfoPrint(
        "Building with " + str(GetOption('num_jobs')) + " parallel jobs")

推荐阅读