标签: argparse

Python argparse - 为多个子分析器添加参数

我的脚本定义了一个主解析器和多个子解析器.我想将这个-p论点应用于一些subparser.到目前为止代码看起来像这样:

parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")

parser.add_argument("-v", "--verbose",
                    action="store_true",
                    dest="VERBOSE",
                    help="run in verbose mode")

parser_create = subparsers.add_parser ("create", 
                                        help = "create the orbix environment")
parser_create.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

# Update
parser_update = subparsers.add_parser ("update", 
                                        help = "update the orbix environment")
parser_update.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")
Run Code Online (Sandbox Code Playgroud)

如你所见,add_arument ("-p")重复两次.我实际上有更多的subsparsers.有没有办法循环遍历现有的子分析符以避免重复?

为了记录,我使用的是Python 2.7

python argparse

60
推荐指数
4
解决办法
3万
查看次数

使用argparse在Python中使用可选的stdin

我发现了非常有用的语法

parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default='-')
Run Code Online (Sandbox Code Playgroud)

用于指定输入文件或使用stdin - 我想在程序中使用它们.但是,并不总是需要输入文件.如果我没有使用-i或重定向输入

$ someprog | my_python_prog
$ my_python_prog < inputfile
Run Code Online (Sandbox Code Playgroud)

我不希望我的Python程序等待输入.我希望它只是移动并使用默认值.

python stdin argparse

60
推荐指数
3
解决办法
2万
查看次数

在Python的argparse中多次使用相同的选项

我正在尝试编写一个接受多个输入源的脚本,并对每个源做一些事情.像这样的东西

./my_script.py \
    -i input1_url input1_name input1_other_var \
    -i input2_url input2_name input2_other_var \
    -i input3_url input3_name
# notice inputX_other_var is optional
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何使用它argparse.它似乎设置为每个选项标志只能使用一次.我知道如何将多个参数与单个选项(nargs='*'nargs='+')相关联,但仍然不允许我-i多次使用该标志.我该如何完成这项工作?

为了清楚起见,我最终想要的是一系列字符串列表.所以

[["input1_url", "input1_name", "input1_other"],
 ["input2_url", "input2_name", "input2_other"],
 ["input3_url", "input3_name"]]
Run Code Online (Sandbox Code Playgroud)

python argparse multiple-arguments

59
推荐指数
4
解决办法
3万
查看次数

argparse的目录路径类型

我的python脚本需要从命令行传递的目录中读取文件.我已经定义了一个如下所示的readable_dir类型,用于与argparse一起验证在命令行上传递的目录是否存在且可读.此外,还为directory参数指定了默认值(下例中的/ tmp/non_existent_dir).这里的问题是argparse在默认值上调用readable_dir(),即使在命令行中显式传入目录参数的情况下也是如此.这会导致脚本丢失,因为在命令行上显式传入目录的上下文中不存在缺省路径/ tmp/non_existent_dir.我可以通过不指定默认值并强制使用此参数,或者通过将验证推迟到脚本中的后期来解决这个问题,但这是一个更优雅的解决方案,任何人都知道吗?

#!/usr/bin/python
import argparse
import os

def readable_dir(prospective_dir):
  if not os.path.isdir(prospective_dir):
    raise Exception("readable_dir:{0} is not a valid path".format(prospective_dir))
  if os.access(prospective_dir, os.R_OK):
    return prospective_dir
  else:
    raise Exception("readable_dir:{0} is not a readable dir".format(prospective_dir))

parser = argparse.ArgumentParser(description='test', fromfile_prefix_chars="@")
parser.add_argument('-l', '--launch_directory', type=readable_dir, default='/tmp/non_existent_dir')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

python argparse

55
推荐指数
3
解决办法
4万
查看次数

Argparse需要subsparser

我正在使用Python 3.4,我正在尝试使用argparsesubparsers,我希望在Python 2.x中有一个类似的行为,如果我不提供位置参数(表示subparser/subprogram)我会收到一条有用的错误消息.即,python2我将收到以下错误消息:

$ python2 subparser_test.py    
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)

required按照/sf/answers/1609615031/中的建议设置了属性,但是这给我带来了Python 3.4.0的错误: TypeError: sequence item 0: expected str instance, NoneType found- 完全回溯:

$ python3 subparser_test.py    
Traceback (most recent call last):
  File "subparser_test.py", line 17, in <module>
    args = parser.parse_args()
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 argparse python-3.x

55
推荐指数
1
解决办法
2万
查看次数

Python argparse和bash完成

我想在我的python脚本中也可以在参数中自动完成.

我从来没有真正理解bash_completion是如何工作的(对于参数),但是在我深入了解之后我明白了:

  1. 它使用"完成"将完成函数绑定到命令
  2. 每个完成函数基本上都是参数解析器的副本

第二点尤其不是很好,因为我想让它自动生成.

最好的事情是shell会在每个TAB上向我的程序询问要完成什么,但我的印象是这不能真正起作用,这是正确的吗?

第二个选项可能只是将一个转换器从argparse解析器写入一个正确完成的shell函数.

python argparse bash-completion

54
推荐指数
2
解决办法
2万
查看次数

文件作为argparse的命令行参数 - 如果参数无效,则出现错误消息

我目前正在使用这样的argparse:

import argparse
from argparse import ArgumentParser

parser = ArgumentParser(description="ikjMatrix multiplication")
parser.add_argument("-i", dest="filename", required=True,
    help="input file with two matrices", metavar="FILE")
args = parser.parse_args()

A, B = read(args.filename)
C = ikjMatrixProduct(A, B)
printMatrix(C)
Run Code Online (Sandbox Code Playgroud)

现在我想指出,该参数-i应该是一个可读的文件.我怎样才能做到这一点?

我已经尝试添加type=open,type=argparse.FileType('r')但他们工作,但如果文件无效,我想收到一条错误消息.我怎样才能做到这一点?

python argparse

53
推荐指数
4
解决办法
6万
查看次数

Argparse:如何处理可变数量的参数(nargs ='*')

我认为这nargs='*'足以处理可变数量的参数.显然它不是,我不明白这个错误的原因.

代码:

p = argparse.ArgumentParser()
p.add_argument('pos')
p.add_argument('foo')
p.add_argument('--spam', default=24, type=int, dest='spam')
p.add_argument('vars', nargs='*')

p.parse_args('1 2 --spam 8 8 9'.split())
Run Code Online (Sandbox Code Playgroud)

我认为最终的命名空间应该是Namespace(pos='1', foo='2', spam='8', vars=['8', '9']).相反,argparse给出了这个错误:

usage: prog.py [-h] [--spam SPAM] pos foo [vars [vars ...]]
error: unrecognized arguments: 9 8
Run Code Online (Sandbox Code Playgroud)

基本上,argparse不知道在哪里放这些额外的参数......为什么?

python argparse

52
推荐指数
3
解决办法
7万
查看次数

不区分大小写的argparse选项

是否可以以不区分大小写的方式检查argparse选项

import argparse
choices = ["win64", "win32"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "Win32"]))
Run Code Online (Sandbox Code Playgroud)

结果是:

usage: choices.py [-h] [-p {win64,win32}]
choices.py: error: argument -p: invalid choice: 'Win32' (choose from 'win64','win32')
Run Code Online (Sandbox Code Playgroud)

python case-insensitive argparse

52
推荐指数
4
解决办法
1万
查看次数

如何正确使用argparse subparsers?

我一直在搜索这里和一般的子分析器示例,但似乎无法想象这个看似简单的事情.

我有两个var类型,其中一个有约束,所以认为subparser是要走的路.例如-t允许"A"或"B".如果用户通过"A",那么他们还需要指定它是"a1"还是"a2".如果他们只通过"B"则没有.

我可以这样做并让argparse返回我通过什么类型的"A"或者它只是"B"?

下面似乎工作但由于某种原因在subparse后传递任何东西时中断.

例如来自Linux终端

>> python test01.py -t A a1 -v 61
Run Code Online (Sandbox Code Playgroud)

错误......

usage: test01.py a1 [-h]
test01.py a1: error: unrecognized arguments: -v
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的.

代码:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')

parser.add_argument("-t",
                    choices = ["A", "B"],
                    dest = "type",
                    required=True,
                    action='store',
                    help="Some help blah blah")

cam_parser = subparsers.add_parser('a1', help='Default')
cam_parser.set_defaults(which='a1')

cam_parser = subparsers.add_parser('a2', help='parse this instead of default')
cam_parser.set_defaults(which='a2')


parser.add_argument("-v",
                    nargs = '+',
                    required=True,
                    dest = "version",
                    type=int,
                    action='store',
                    help="some version help blah blah")   

argument …
Run Code Online (Sandbox Code Playgroud)

python argparse

50
推荐指数
1
解决办法
5万
查看次数