在argparse中使用子命令创建解析器,自定义位置参数

用户名

我对这个模块还很陌生,所以请多多包涵。我有以下代码:

reader.py

import argparse

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')
parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")

child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")

args = parent_parser.parse_args()

我要实现的目标可能不是解析器和unix命令行实用程序的标准工作方式。如果是这样,请更正我,因为我想拥有标准化的应用程序。

这是我要实现的目标:

  • 如果你像这样运行与位置参数(S)裸脚本:python reader.py some.txt我想能够只是解析它,并把它传递给函数读取文本文件,我当然要接受可选ARGverbose以及
  • 如果您运行子命令“ new”(new_file_command),则我不需要位置参数filename,而是要传递字符串并创建新的文本文件,如下所示:python reader.py new another.txt
  • 如果您运行子命令'edit'(edit_file_command),我想在路径中传递现有文件并进行检查(就像您type=int在中使用一样add_argument),然后将其传递给打开编辑器的函数,如下所示:python reader.py edit some.txt

同样,我不确定这是否是命令行应用程序/脚本的行为方式。我阅读了文档并查看了示例,但是我仍然不清楚子解析器是如何工作的。我尝试查看Click模块,但是在我看来,这甚至更加复杂。

任何帮助表示赞赏。谢谢!

hpaulj

因此,有三个示例调用:

python reader.py some.txt 
python reader.py new another.txt
python reader.py edit some.txt

处理这些问题的最简单方法是使用一个“可选”位置,并使用一个必需位置。

parser = ArgumentParser...
parser.add_argument('-v','--verbose', ...)
parser.add_argument('cmd', nargs='?', default='open', choices=['open','edit','new'])
parser.add_argument('filename')

对于您的3个样本,它应产生类似以下内容的内容:

namespace(cmd='open', filename='some.txt')
namespace(cmd='new', filename='another.txt')
namespace(cmd='edit', filename='some.txt')

cmd是一个可选的位置参数。如果丢失,则将一个字符串分配给filename,并cmd获取其default比尝试使它更容易做到这一点subparsers


至于您当前的解析器:

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')

我不建议使用type=file最好使用FileType默认字符串(最好让您with context稍后使用该文件)。

至于nargs='+',您是否真的要分配1 or more字符串filename还是您在考虑'?',它是0 or 1,即使其成为可选项?

parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")

child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")

将此filename接受可变数量值的位置与subparsers自变量(期望new的位置edit混合在一起可能是一个问题。

我希望'python reader.py some.txt'反对缺少subparser命令。'python reader.py new another.txt'将尝试分配newfilenameanother.txt,以及分配给子解析器,并引发错误。

最好在所有3种情况下都使用subparsers命令:

parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('--verbose', '-v', action='store_true', 
        help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
        help="Subcommand help", dest='cmd')
open_file_command = child_parser.add_parser('open', help="Open text file")
open_file_command.add_argument('filename', help='TXT file')
new_file_command = child_parser.add_parser('new', help="New text file")
new_file_command.add_argument('filename', help='TXT file')
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
edit_file_command.add_argument('filename', help='TXT file')

每个命令“ open”,“ new”,“ edit”都需要一个“ filename”。

试图避免使用open命令会造成更多的困难,而不是值得的。

(最新的argparse中存在一个错误/功能,该错误/功能使子解析器成为可选功能,但您应该在不真正了解问题的情况下利用该功能。)


和:

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose') 
parser.add_argument('cmd', nargs='?', default='open', 
    choices=['open', 'edit', 'new']) 
parser.add_argument('filename', nargs='+') 

我希望reader.py new customstring

namespace(cmd='new', filename=[customstring])

可以用作:

if args.cmd=='new':
with open(args.filename[0] + '.txt', 'w') as f:
     # do something with the newly created file

openedit会使用不同的open模式。


请注意,在Py3subparsers中不是必需的。也就是说,如果未提供子命令之一,则不会引发错误。与早期版本相比,这是无意的更改。

带有所需子解析器的Argparse

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用JavaScript创建自定义Markdown解析器

配置 Spring MockMvc 以在内置参数解析器之前使用自定义参数解析器

如何在python argparse中使用子解析器定义全局选项?

PHP自定义命令解析器

分组argparse子解析器参数

@PathVariable的自定义参数解析器

Spring Data Rest自定义参数解析器

AutoMapper-如何在自定义类型转换器中使用自定义值解析器

如何在Wildfly中使用自定义系统属性解析器

在Spring中使用自定义解析器返回HTTP Status BAD_REQUEST

如何在 jar 文件中使用 Tika 自定义解析器?

如何在Python的Beautiful Soup中使用自定义解析器?

SBT插件未使用自定义解析器

使用改造自定义解析器发布请求

使用自定义解析器跳过空值

Automapper自定义解析器

java.lang.IllegalArgumentException:使用 Spring 自定义参数解析器时参数类型不匹配

在一个命令中使用多个子解析器的 Argparse

如何在argparse中将顶级参数与子解析器一起使用

如何从 Python 3 中的现有程序使用 argparse 创建子解析器?

使用 sklearn 创建自定义转换器 - 缺少所需的位置参数错误

在子解析器中使用`err`

子属性的JSON .NET自定义名称解析器

传递参数以增强Spirit自定义解析器

AutoMapper-将参数传递给自定义解析器怪异行为

如何在 PureScript 中为 SimpleJSON 创建自定义解析器 Monad?

如何为 Gatsby 页面查询创建自定义解析器?

Scala:自定义语法/解析器组合器

如何正确使用argparse子解析器?