【问题标题】:Python Argument Parser - the following arguments are reqired --namePython Argument Parser - 需要以下参数 --name
【发布时间】:2019-11-25 08:01:13
【问题描述】:

当我运行以下代码时:

def read_args():
    parser = default_parser()
    parser.add_argument('--tensorboard-dir', type=str, default='/tmp/cifar10/tensorboard')
    parser.add_argument('-N', type=int, default=50000, help="Use N training examples.")

    return parser.parse_args()

def main():
    flags = readargs()

我有以下错误输出:

以下参数是必需的:--name

但是,当我添加 --name 参数时:

def read_args():
    parser = default_parser()
    parser.add_argument('--name', type=str, default='cifar10test')
    parser.add_argument('--tensorboard-dir', type=str, default='/tmp/cifar10/tensorboard')
    parser.add_argument('-N', type=int, default=50000, help="Use N training examples.")

    return parser.parse_args()


def main():
    flags = readargs()

也在制造问题。

有什么想法吗?

【问题讨论】:

  • 什么是default_parser?你到底是怎么运行这个的?最后,错误并不是说您需要定义参数name,而是在命令行调用中添加它。如果您的意思是 literaly 运行上述代码,则不会传递任何参数。更改为 parser.parse_args([...]) 并在列表中填写您要传递的参数(所有字符串)
  • 该错误也显示了“用法”。这是什么?
  • 错误意味着您必须以 script.py --name some_value 的身份运行脚本。可能在default_parser() 你有add_argument('--name', ...)。运行 script.py --help 以查看所有参数。
  • 当您尝试添加自己的 --name 参数时,错误是什么?我怀疑它抱怨了一个相互矛盾的定义。这将证实default_parser 已经定义了--name 的想法(根据需要)。
  • @Tomerikoo 亲爱的Tomerikoo,默认解析器方法包含大量参数变量,我没有添加它,因为我认为它可能会造成混淆。要我添加 default_parser 方法吗?

标签: python python-3.x argparse


【解决方案1】:

default_parser 似乎包含一个必需的 --name 参数。您在第二个示例中所做的是两次定义参数 - 一次在 default_parser 中,一次在您的程序中。相反,您应该在从命令行调用程序时传递 --name 参数。

例子:

python cifar.py -N=1200 --tensorboard-dir=file.txt --name=cool_name

或者,您可以删除 default_parser 并构建您自己的 ArgumentParser:

`parser = argparse.ArgumentParser()`

完整的工作演示:

import argparse

def read_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--tensorboard-dir', type=str,
                        default='/tmp/cifar10/tensorboard')
     parser.add_argument('-N', type=int, default=50000,
                         help="Use N training examples.")

     return parser.parse_args()

def main():
    flags = vars(read_args())
    # You can access your args as a dictionary
    for key in flags:
        print("{} is {}".format(key, flags[key]))

main()

解析器返回一个Namespace 对象,但我们可以使用vars(Namespace) 访问其(更简单的)内部字典。然后,您可以通过访问字典来获取您的参数,例如,flags['N']。请注意,tensorboard-dir 在您的 Python 程序 to avoid issues with the subtraction operator 中变为 tensorboard_dir

从命令行调用它(我正在使用 Bash):

python cifar.py -N=1200 --tensorboard-dir=file.txt

输出:

tensorboard_dir is file.txt
N is 1200

【讨论】:

  • 正如有人在问题的 cmets 中指出的那样,我猜您是从其他地方导入 default_parser()。如果您包含源代码,那么有人可以提供帮助,但我猜它有一个必需的 --name 参数。如果是这样,您需要在从命令行调用程序时添加该参数,而不是尝试通过将其添加为另一个参数来覆盖它。
  • 他不需要做sys.argv[1:] 的事情,因为这是默认设置。 print(flags) 足以看到命名空间。但这些都没有解决“--name”错误。
  • 鉴于他不知道 --name 是什么并且没有在其他任何地方引用它,我认为他不想要它并且只是重用一段代码。 sys.argv 是对的(我对 argparse 不太熟悉)-我正在完全更新答案以反映这一点。
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2023-02-09
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多