【问题标题】:How to figure out which command line parameters have been set in plac?如何确定哪些命令行参数已设置到位?
【发布时间】:2015-10-22 09:28:27
【问题描述】:

我的Python 脚本按以下顺序获取配置值:

  1. 命令行参数(可以覆盖配置文件中用户定义的值)
  2. 配置文件值(用户定义值)
  3. 源代码中的默认值

我需要弄清楚在命令行上设置了哪个选项,以确定是否明确设置了默认值。 plac [不是?] 非常透明,我看不出这怎么可能。我想避免解析sys.argv,因为编写命令行解析器以使用命令行解析器似乎不是一个好主意。

我在Ubuntu 15.04 上使用plac 0.9.1。

【问题讨论】:

  • 你为什么关心(默认)值是来自命令行还是来自其他地方?
  • @CristianCiupitu 我明确指出用户定义的值都在配置文件中,并且可以在命令行中指定。如果在命令行上指定了默认值(例如,因为用户不知道默认值),我需要知道我是否从配置文件中获取值。
  • 为什么不使用 3 个变量,一个用于默认参数,一个用于命令行?然后,您可以检查是否有 var_command_line_param 否则使用默认值并影响您的区间变量,即脚本用来执行任务的变量...
  • 我不知道如何在plac中获取这些信息,即如何设置这两个或三个变量的值或让plac为我设置它们,请解释!对我来说,一切都归结为一个 python 函数。我需要访问哪个对象?

标签: python argparse


【解决方案1】:

您能否举一个简单的plac 设置示例?以前很了解,现在更了解底层argparse

您是否使用plac 直接调用函数例如

plac.call(main)

在内部plac 创建一个argparse.ArgumentParser(实际上是它自己的子类),用从函数签名派生的参数填充它。然后使用它解析的值调用该函数。

如果直接使用argparse,则创建解析器,填充它,然后调用它

args = parser.parse_args()

args 现在是一个 Namespace 对象,其属性以参数命名。也可以转换成字典。

如果您使用argparse 路由(可能仍在使用plac 创建解析器),您可以轻松检查args 中的属性,并将这些值与您的默认值或config 文件值进行比较.

IPython 实际上使用从配置文件(默认和自定义)派生的参数填充 argparse.parser。这使您可以在多个阶段覆盖配置默认值 - 使用自定义文件或使用命令行。

plac 应该比argparse 更容易,通过集成解析器创建和函数调用。但在您的情况下,将这些步骤分开可能会更好。


plac.call 的代码是:

def call(obj, arglist=sys.argv[1:], eager=True):
   ...
   cmd, result = parser_from(obj).consume(arglist)
   ...

第一部分创建一个解析器;此解析器的参数基于注释装饰器。我的测试中的main 来自plac 文档。

In [22]: p=plac.parser_from(main)

In [23]: p
Out[23]: ArgumentParser(prog='ipython2.7', usage=None, description=None, version=None, formatter_class=<class 'argparse.RawDescriptionHelpFormatter'>, conflict_handler='error', add_help=True)

p.consume 是一个更长的函数,用于检查子解析器之类的东西。但在某些时候确实如此

ns, extraopts = self.parse_known_args(arglist)
   # or self.parse_args

ns 是一个 argparse 命名空间,其参数由解析器设置 - 默认值和命令行参数。然后它使用来自ns 的值调用“函数”(分为Python 位置参数和关键字参数)。

所以你可以直接调用那个解析器:

In [25]: p.parse_args([])    # or with the default sys.argv[1:]
Out[25]: Namespace(args=[], kw={}, opt=None)

p.print_help() 还显示了它期望从命令行获得的参数,但格式整齐。

如果您想进一步了解argparse 的内容,可以查看p._actions,它是用于解析命令行的argparse.Action 对象列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多