python - 在使用 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 选项解析器。
解决方案
从评论中链接的这个问题: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")
推荐阅读
- akka - 以下 akka.conf 文件是否有效?
- android - Many to one relation
- python - 无法从图像中提取单词
- java - How to modify an encapsulated library in Java?
- string - How to fix faulty base64 urls received by client?
- javascript - selenium-webdriver 在打开浏览器后不会执行下一步
- java - 在 Spring Boot 中将响应下载为 POST 请求的文本文件
- r - 在 R 中保存 Unicode 字符
- java - 在 oracle 数据库的 blob 字段上存储大型 json
- sql - 如何转换为程序