我正在编写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已经从命令中解析出来,这是不可取的.
我怎么能够:
我想在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中执行此操作?
如何设置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如果重要的话.
使用方法的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' ...>)的字符串表示中,因此应该是可能的.
怎么做?
我正在向我的解析器添加subparsers来模拟子命令功能(例如代码见:python中的简单命令行应用程序 - 解析用户输入?).现在我想添加一个quit不带参数的subparser/command并附加一个"quit"动作.可能吗 ?我该怎么办呢?
是否可以在解析参数时使用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脚本来处理一个机器可读的文件,并输出一个包含在其中的数据的人类可读报告.
我想提供输出数据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,我并不担心与其他版本的兼容性,因为目前还没有计划与其他人共享此脚本.这只是为了让我的生活更轻松.
这是一个示例代码:
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是一个有效的论点.
我使用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 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)