标题基本概括了所有内容.如果我有大于1的nargs,有什么办法可以在解析的各个args上设置限制(例如选择/类型)吗?
这是一些示例代码:
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--credits', nargs=2,
help='number of credits required for a subject')
Run Code Online (Sandbox Code Playgroud)
对于-c参数,我需要指定一个主题以及需要多少学分.主题应限于预定义的主题列表,所需的学分数应为浮点数.
我可以用subparser做到这一点,但因为它已经是子命令的一部分,所以我真的不想让事情变得更复杂.
我想使用pythons argparse模块来解析我的cli参数字符串.这适用于从终端传递的参数,但不适用于给定的字符串.
import argparse
parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')
argString = 'someTestFile'
print(argString)
args = parser.parse_args(argString)
Run Code Online (Sandbox Code Playgroud)
如果我运行此脚本,我得到此输出:
~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
Run Code Online (Sandbox Code Playgroud)
在~/someTestFile以某种方式在转变o m e T e s t F i l e.如前所述,如果我从终端传递文件名,它就可以工作.
我可以想象,这与字符串编码有关.有人知道如何解决这个问题吗?
使用Python的argparse,我想添加一个可选参数,如果没有给出,则获取另一个(强制)参数的值.
parser.add_argument('filename',
metavar = 'FILE',
type = str,
help = 'input file'
)
parser.add_argument('--extra-file', '-f',
metavar = 'ANOTHER_FILE',
type = str,
default = ,
help = 'complementary file (default: FILE)'
)
Run Code Online (Sandbox Code Playgroud)
我当然可以None在解析参数后手动检查,但是不是有更多的pythonic方法吗?
我有一个调用其插件的特定配置文件.可以将参数传递给这些插件.此配置文件还允许我在运行时调用任意命令.
插件使用了许多参数:其中一个是-h并且它不代表--help.现在,我的问题是我想调用我自己的Python脚本以及传递一些参数.我正在使用argparse,并希望与配置的其余部分保持一致,我创建了一个-h标志.令我惊讶的是,argparse只是给了我argparse.ArgumentError: argument -h/--help: conflicting option string(s): -h而不是自己创业.
有没有办法阻止这种情况发生?
我很清楚,大多数人都希望-h提供帮助,但这是我自己的脚本,我想我比argparse devs更清楚我想要使用标志.
是否可以添加自定义"使用"功能,而不是python argparse提供的默认用法消息.
示例代码:
parser = argparse.ArgumentParser(description='Sample argparse py')
parser.add_argument('-arg_1',type=int, custom_usage_funct('with_some_message'))
output = parser.parse_args()
def custom_usage_funct(str):
print str
print '''
Usage: program.py
[-a, Pass argument a]
[-b, Pass argument b]
[-c, Pass argument c]
[-d, Pass argument d]
comment
more comment
'''
Run Code Online (Sandbox Code Playgroud)
如果传递的参数是字符串值而不是整数,则程序应调用自定义使用函数,并显示错误消息"请提供整数值"
有效参数
program.py -arg_1 123
Run Code Online (Sandbox Code Playgroud)
无效的论点
program.py -arg_1 abc
Please provide an integer value
Usage: program.py
[-a, Pass argument a]
[-b, Pass argument b]
[-c, Pass argument c]
[-d, Pass argument d]
comment
more comment
Run Code Online (Sandbox Code Playgroud) 我正在尝试拥有一个必需的互斥组,其中包含一个必需参数.以下是我提供的代码
#!/usr/bin/python
import argparse
import sys
# Check for the option provided as part of arguments
def parseArgv():
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", choices=[1,2,3,4],
help = "Increase verbosity")
group.add_argument("-q", "--quiet", action="store_true", help = "Run quietly")
name = parser.add_mutually_exclusive_group(required=True)
name.add_argument("-n", "--name", help = "Name of the virtual machine")
name.add_argument("-t", "--template", help = "Name of the template to use \
for creating vm. If path is not provided then it will be looked \
under template directory.")
parser.add_argument("-s", "--save", …Run Code Online (Sandbox Code Playgroud) 我一直在整个文档,似乎没有办法做到这一点,但是:
有没有办法将argparse与任何字符串列表一起使用,而不是仅使用sys.argv?
这是我的问题:我有一个看起来像这样的程序:
# This file is program1.py
import argparse
def main(argv):
parser = argparse.ArgumentParser()
# Do some argument parsing
if __name__ == '__main__':
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
从命令行直接调用此程序时,此方法正常.但是,我有另一个python脚本,它使用不同的命令行参数运行此脚本的批处理版本,我正在使用这样:
import program1
arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)
Run Code Online (Sandbox Code Playgroud)
我仍然希望能够解析参数,但argparse自动默认使用sys.argv而不是我给它的参数.有没有办法传入参数列表而不是使用sys.argv?
这是最简单的Python脚本,名为test.py:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--bool', default=True, type=bool, help='Bool type')
args = parser.parse_args()
print(args.bool)
Run Code Online (Sandbox Code Playgroud)
但是当我在命令行上运行此代码时:
python test.py --bool False
True
Run Code Online (Sandbox Code Playgroud)
而当我的代码读取时'--bool', default=False,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脚本来处理一个机器可读的文件,并输出一个包含在其中的数据的人类可读报告.
我想提供输出数据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,我并不担心与其他版本的兼容性,因为目前还没有计划与其他人共享此脚本.这只是为了让我的生活更轻松.