标签: argparse

不要在最后一个位置参数后解析选项

我正在编写ssh命令行客户端的包装器.在第一个位置参数之后command,所有其他选项也应被视为位置参数.

optparse,我相信这将完成disable_interspersed_args.

现在我有这样的事情:

parser = argparse.ArgumentParser()
parser.add_argument('--parallel', default=False, action='store_true')
# maybe allow no command? this would ssh interactively into each machine...
parser.add_argument('command', nargs='+')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

但是如果选项作为命令的一部分传递(例如my_wrapper ls -l),则它们将被解释ArgumentParser为未知选项.error: unrecognized arguments: -l

如果我使用parse_known_args(),选项可能会不按顺序.

p = argparse.ArgumentParser()
p.add_argument('-a', action='store_true')
p.add_argument('command', nargs='+')
print(p.parse_known_args())

$ python3 bah.py -b ls -l -a
(Namespace(a=True, command=['ls']), ['-b', '-l'])
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到-b之前的位置ls已经丢失,并且-a已经从命令中解析出来,这是不可取的.

我怎么能够:

  • 防止在某个点之后解析参数?
  • 禁用散布参数的解析?
  • 允许带有前缀的参数作为位置参数使用?

python argparse

15
推荐指数
2
解决办法
2930
查看次数

Python argparse:具有一些兼容参数的互斥组

我想在argparse中实现这样的逻辑:

If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected
Run Code Online (Sandbox Code Playgroud)

它看起来就像add_mutually_exclusive_group我想要的那样,但看起来你只能从一个互斥的组中选择一个选项,所以我不能将所有三个选项放在一个互斥的组中.

有没有办法在argparse中执行此操作?

python argparse

15
推荐指数
2
解决办法
3236
查看次数

Python argparse条件要求

如何设置argparse如下:

if -2 is on the command line, no other arguments are required
if -2 is not on the command line, -3 and -4 arguments are required
Run Code Online (Sandbox Code Playgroud)

例如,

-2 [good]
-3 a -4 b [good]
-3 a [not good, -4 required]
-2 -5 c [good]
-2 -3 a [good]
Run Code Online (Sandbox Code Playgroud)

这里有许多类似的问题,但要么他们没有解决这种情况,要么我不理解.

Python 2.7如果重要的话.

python python-2.7 argparse

15
推荐指数
1
解决办法
9874
查看次数

如何为此参数指定type = FileType(...)时使用argparse获取文件名

使用方法的type参数argparse.add_argument,您可以要求参数为可读文件:

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

作为指定此类型的好处,argparse会检查是否可以读取文件,如果没有,则会向用户显示错误.

有没有办法获取传递的文件名而不是io.TextIOWrapper或的实例io.BufferedReader

由于文件名出现在解析器('sqlite_file': <_io.TextIOWrapper name='data/export.sqlite' ...,或'sqlite_file': <_io.BufferedReader name='data/export.sqlite' ...>)的字符串表示中,因此应该是可能的.

怎么做?

python argparse

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

python argparse - 向没有参数的subparser添加动作?

我正在向我的解析器添加subparsers来模拟子命令功能(例如代码见:python中的简单命令行应用程序 - 解析用户输入?).现在我想添加一个quit不带参数的subparser/command并附加一个"quit"动作.可能吗 ?我该怎么办呢?

python python-2.7 argparse

15
推荐指数
1
解决办法
5969
查看次数

Python:参数解析验证最佳实践

是否可以在解析参数时使用argparse模块添加验证?

from argparse import ArgumentParser

parser = ArgumentParser(description='Argument parser for PG restore')

parser.add_argument('--database', dest='database',
                    default=None, required=False, help='Database to restore')

parser.add_argument('--backup', dest='backup',
                    required=True, help='Location of the backup file')

parsed_args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

是否可以在此参数解析器中添加验证检查,以确保备份文件/数据库存在?而不是必须在此之后为每个参数添加额外的检查,例如:

from os.path import exists
if not database_exists(parsed_args.database):
    raise DatabaseNotFoundError
if not exists(parsed_args.backup):
    raise FileNotFoundError
Run Code Online (Sandbox Code Playgroud)

python validation argparse

15
推荐指数
3
解决办法
9217
查看次数

Python argparse - 如果没有给出参数,则使用默认的互斥组

我正在编写一个Python脚本来处理一个机器可读的文件,并输出一个包含在其中的数据的人类可读报告.
我想提供输出数据stdout (-s)(默认情况下)或txt (-t)或csv (-c)文件的选项.我希望有一个默认行为的开关,就像许多命令一样.

Usage:我而言,我希望看到类似的东西script [-s | -c | -t] input file,并且-s如果没有传递参数则成为默认值.

我目前有(相关的args,简而言之):

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_true')
group.add_argument('-c', '--csv', action='store_true')
group.add_argument('-t', '--txt', action='store_true')
args = parser.parse_args()

if not any((args.stdout, args.csv, args.txt)):
    args.stdout = True
Run Code Online (Sandbox Code Playgroud)

所以,如果没有的-s,-t-c设定,stdout (-s)被迫为True,就好像-s已经过去了.

有没有更好的方法来实现这一目标?或者由于某种原因,另一种方法是否会被视为"更好"?

注意:我使用的是Python 3.5.1/2,我并不担心与其他版本的兼容性,因为目前还没有计划与其他人共享此脚本.这只是为了让我的生活更轻松.

python argparse python-3.x

15
推荐指数
1
解决办法
4966
查看次数

在python中,如何在父解析器的参数中读取子分析器?

这是一个示例代码:

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparser=parser.add_subparser()
a=subparser.add_parser('run')
a.add_argument('required_sub_arg')
a.add_argument('arg_a')
b=subparser.add_parser('b')
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

-main_arg如果我进入,我希望它能读入program run required_sub_arg -main_arg -arg_a

现在,它不承认-main_arg是一个有效的论点.

python argparse

14
推荐指数
2
解决办法
5699
查看次数

如何确定是否在命令行中实际指定了argparse参数?

我使用arparse使用命令行中指定的值更新配置dict.因为我只想更新配置中的值,在命令行中明确提到了值.

因此,我尝试通过检查每个操作是否getattr(args, action.dest) == action.default等于转换类型的arg 来识别未指定的参数.然后我更新dict中我的所有值,这是错误的.

但是这当然失败了,如果我在命令行中明确指定一个与我的默认参数相同的参数.是否有可能使用argparser识别这些明确提到的参数,或者我是否必须在sys.argv中手动识别它们?

谢谢!

编辑:

让我的意图更清晰.我有一个如下的论点:

parser.add_argument('--test', default='meaningful_default')

和配置一样

config = { 'test' : 'nondefault_val'}

现在我想只使用明确指定的参数更新配置.将args属性与默认值进行比较只要我没有指定类似于prog.py --test meaningful_default再次更新我的配置的值,这个值恰好也是默认值

python argparse

14
推荐指数
4
解决办法
5507
查看次数

'required'是python命令中positionals的无效参数

我想用必需和可选参数实现导入功能,以这种方式运行:

python manage.py import --mode archive
Run Code Online (Sandbox Code Playgroud)

哪里--mode是必要的,archive也是.

我正在使用argparse库.

class Command(BaseCommand):
    help = 'Import'

    def add_arguments(self, parser):
        parser.add_argument('--mode',
            required=True,
        )
        parser.add_argument('archive',
            required=True,
            default=False,
            help='Make import archive events'
        )
Run Code Online (Sandbox Code Playgroud)

但我收到了错误:

TypeError: 'required' is an invalid argument for positionals
Run Code Online (Sandbox Code Playgroud)

python import arguments argparse

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

标签 统计

argparse ×10

python ×10

python-2.7 ×2

arguments ×1

import ×1

python-3.x ×1

validation ×1