我对这个模块还很陌生,所以请多多包涵。我有以下代码:
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命令行实用程序的标准工作方式。如果是这样,请更正我,因为我想拥有标准化的应用程序。
这是我要实现的目标:
python reader.py some.txt
我想能够只是解析它,并把它传递给函数读取文本文件,我当然要接受可选ARGverbose
以及new_file_command
),则我不需要位置参数filename
,而是要传递字符串并创建新的文本文件,如下所示:python reader.py new another.txt
edit_file_command
),我想在路径中传递现有文件并进行检查(就像您type=int
在中使用一样add_argument
),然后将其传递给打开编辑器的函数,如下所示:python reader.py edit some.txt
同样,我不确定这是否是命令行应用程序/脚本的行为方式。我阅读了文档并查看了示例,但是我仍然不清楚子解析器是如何工作的。我尝试查看Click模块,但是在我看来,这甚至更加复杂。
任何帮助表示赞赏。谢谢!
因此,有三个示例调用:
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'
将尝试分配new
给filename
和another.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
open
并edit
会使用不同的open
模式。
请注意,在Py3subparsers
中不是必需的。也就是说,如果未提供子命令之一,则不会引发错误。与早期版本相比,这是无意的更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句