我有一个脚本,我要求用户提供要执行的预定义操作的列表.我还希望能够在用户没有定义任何内容时采用特定的操作列表.然而,似乎试图将这两者结合在一起是不可能的.
当用户不提供参数时,他们会收到默认选项无效的错误
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args([])
>>> usage: [-h] [{clear,copy,dump,lock} [{clear,copy,dump,lock} ...]]
: error: argument action: invalid choice: [['dump', 'clear']] (choose from 'clear', 'copy', 'dump', 'lock')
Run Code Online (Sandbox Code Playgroud)
当它们确定一组动作时,结果命名空间将用户的动作附加到默认值,而不是替换默认值
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args(['lock'])
args
>>> Namespace(action=[['dump', 'clear'], ['dump']])
Run Code Online (Sandbox Code Playgroud) 我想为我的选项显示argparse帮助以同样的方式默认-h,--help并且-v,--version是,没有选项后ALLCAPS文本,或至少不重复的CAPS.
import argparse
p = argparse.ArgumentParser("a foo bar dustup")
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()
Run Code Online (Sandbox Code Playgroud)
这就是我目前得到的python foobar.py -h:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i INI, --ini INI use alternate ini
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i, --ini INI use alternate …Run Code Online (Sandbox Code Playgroud) 我花了一些时间在argparse文档上,但我仍然在为我的程序中的一个选项挣扎这个模块:
parser.add_argument("-r", "--rmsd", dest="rmsd", nargs=2,
help="extract the poses that are close from a ref according RMSD",
metavar=("ref","rmsd"))
Run Code Online (Sandbox Code Playgroud)
我想确切地说第一个参数是一个字符串(type = str)和必需的,而第二个参数是type = int,如果没有给出一个值,则默认值为1(假设默认值= 50).我知道当预期只有一个参数时如何做到这一点,但我不知道当nargs = 2时如何进行......这甚至可能吗?
非常感谢,
我试图学习如何argparse.ArgumentParser工作,我为此写了几行:
global firstProduct
global secondProduct
myparser=argparse.ArgumentParser(description='parser test')
myparser.add_argument("product1",help="enter product1",dest='product_1')
myparser.add_argument("product2",help="enter product2",dest='product_2')
args=myparser.parse_args()
firstProduct=args.product_1
secondProduct=args.product_2
Run Code Online (Sandbox Code Playgroud)
我只是想,当用户运行此脚本有两个参数我的代码并将其分配给firstProduct和secondProduct分别.但它不起作用.有人告诉我为什么吗?提前致谢
我对编码很陌生,特别是Python.我正在尝试学习如何将我创建的argparse参数传递给类以使用正确/推荐的方式.除了学习python之外,我还试图学习如何以OOP方式做事,以便学习其他OOP类型的语言变得更容易.
所以这是我想要做的一个示例:
import argparse
class passyourcliargstome():
def __init__(self, whatdoiputheretogetmycliargs):
#how do I get my cli args here?
pass
def otherfunctionsthatdothings():
pass
if __name__ == '__main__':
#grab the arguments when the script is ran
parser = argparse.ArgumentParser(
description='Make things happen.')
parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons')
parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons')
passyourcliargstome.otherfunctionsthatdothings()
Run Code Online (Sandbox Code Playgroud)
所以,我定义的主类之外argparse参数,并想知道如何让他们内部的类.这甚至是正确的方法吗?我应该在我的班级下制作一个argparse函数吗?
提前感谢您提供任何帮助,参考等.
编辑:美国东部时间11月16日2:18
注意:由于我没有足够的代表回答我自己的问题,这是我发布正确答案的唯一办法.
好吧,我花了一些时间,但我设法把它拼凑起来.RyPeck的答案帮助我获得了我的参数(我的代码遗漏了一些东西),但后来当我试图测试代码时,我得到了未绑定的方法错误.我不知道那是什么意思.我是否提到过我的屏幕名称?
它并没有真正点击,直到我发现读这个.这是我的工作代码.如果有人有任何要补充的内容,那么直到并且包括"你仍然做错了,这样做是正确的." 我听见了.在此期间,感谢您的帮助.
import argparse
class Passyourcliargstome(object):
def __init__(self):
#here's how I got my args here
self.foo …Run Code Online (Sandbox Code Playgroud) 我想dict(str -> str)从命令行接收一个参数.不argparse.ArgumentParser提供呢?还是其他任何图书馆?
对于命令行:
program.py --dict d --key key1 --value val1 --key key2 --value val2
Run Code Online (Sandbox Code Playgroud)
我期待以下字典:
d = {"key1": "val1", "key2": "val2"}
Run Code Online (Sandbox Code Playgroud) 是否可以删除或禁用argparse中的参数,以便它不会显示在帮助中?怎么样?
添加新参数很容易:
parser = argparse.ArgumentParser()
parser.add_argument('--arg1', help='Argument 1')
parser.add_argument('--arg2', help='A second one')
Run Code Online (Sandbox Code Playgroud)
我知道你可以通过指定"resolve"冲突处理程序来覆盖带有新定义的参数:
#In one script that should stand-alone and include arg1:
parser = argparse.ArgumentParser(conflict_handler='resolve')
parser.add_argument('--arg1', help='Argument 1')
parser.add_argument('--arg2', help='A second one')
#In another script with similar options
parser.add_argument('--arg1', help='New number 1')
Run Code Online (Sandbox Code Playgroud)
但这仍然包括帮助消息中的arg1和结果parse_args是否有类似的东西
#Wishful thinking
#In another script with similar options, that shouldn't include arg1
parser.remove_argument('--arg1')
Run Code Online (Sandbox Code Playgroud)
或者另一种合理简单的方法来实现这一目标?
另外:如果论证是位置论证,那么方法会不同吗?
注:排除故障arg1解析的建议后,这里是参数仍显示在帮助
标题基本概括了所有内容.如果我有大于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做到这一点,但因为它已经是子命令的一部分,所以我真的不想让事情变得更复杂.
使用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方法吗?
我一直在整个文档,似乎没有办法做到这一点,但是:
有没有办法将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?