我想使用argparse来解析形式为"arg = val"的命令行.例如,用法是:
script.py conf_dir=/tmp/good_conf
Run Code Online (Sandbox Code Playgroud)
要实现它,我这样做:
desc = "details"
parser = argparse.ArgumentParser(description=desc, add_help=False)
args = parser.add_argument("conf_dir")
args = parser.parse_args("conf_dir=FOO".split())
args = parser.parse_args()
print args.conf_dir
Run Code Online (Sandbox Code Playgroud)
但是,问题在于,在调用脚本时:
python script.py conf_dir=/tmp/good_conf
Run Code Online (Sandbox Code Playgroud)
我明白了:
conf_dir=/tmp/good_conf
Run Code Online (Sandbox Code Playgroud)
我期待的地方
/tmp/good_conf
Run Code Online (Sandbox Code Playgroud)
所以,问题是:我可以使用argparse来解析包含名称值对的cmd行吗?任何提示?
编辑:我想这样做的原因而不是像--conf_dir =/tmp/good_dir这样的东西是因为还有其他工具(用其他语言编写),它使用conf_dir =/tmp/good_dir样式的参数.为了保持一致性,我是以这种方式解析args.
我有以下代码(使用Python 2.7):
# shared command line options, like --version or --verbose
parser_shared = argparse.ArgumentParser(add_help=False)
parser_shared.add_argument('--version', action='store_true')
# the main parser, inherits from `parser_shared`
parser = argparse.ArgumentParser(description='main', parents=[parser_shared])
# several subcommands, which can't inherit from the main parser, since
# it would expect subcommands ad infinitum
subparsers = parser.add_subparsers('db', parents=[parser_shared])
...
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
现在我希望能够调用此程序,例如--version附加到正常程序或某个子命令:
$ prog --version
0.1
$ prog db --version
0.1
Run Code Online (Sandbox Code Playgroud)
基本上,我需要声明可选的subparsers.我知道这不是真的支持,但有没有任何变通方法或替代方案?
编辑:我收到的错误消息:
$ prog db --version
# works fine
$ prog --version
usage: …Run Code Online (Sandbox Code Playgroud) 我很困扰这项小活动要完成.我做了一些实验,但未能达到效果.
需求:
test2.py [-c/-v] -f
Run Code Online (Sandbox Code Playgroud)
用法或规则:
-c(比较)需要2个参数.
-v(验证)需要1个参数.
这两者中的任何一个都必须存在,但不能同时存在.
输出:
我能够得到所需的输出,如下所示
kp@kp:~/Study/scripts$ ./test.py -c P1 P2 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ ./test.py -c P1 P2
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$
Run Code Online (Sandbox Code Playgroud)
问题是:
当您使用时test.py -h,
1 .输出不会指示-c/-v中的任何一个是强制性的,而不是两者.它表示所有参数都是可选的.
2.输出将在可选参数下指示-f选项,这是不正确的.-f是必需参数,我想显示外部 - 可选参数.
如何更改脚本以便-h选项输出更加用户友好(无需任何外部验证)
usage: test.py …Run Code Online (Sandbox Code Playgroud) 我想有以下语法:
python utility.py file1 FILE1 file2 FILE2
Run Code Online (Sandbox Code Playgroud)
其中file1和file2是可选参数.使用这种语法很简单:
python utility.py --file1 FILE1 --file2 FILE2
Run Code Online (Sandbox Code Playgroud)
运用
parser.add_argument('--file1',type=file)
parser.add_argument('--file2',type=file)
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除破折号,argparse开始将其解释为位置而非可选参数......
换句话说,是否可以专门告诉argparse一个参数是可选的还是位置的,这样我可以有没有破折号的可选参数?
我想解析一个包含以逗号分隔的整数列表的必需的位置参数.如果第一个整数包含一个前导减号(' - '),argparse会抱怨:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-t', '--test', action='store_true')
opts = parser.parse_args()
print opts
$ python example.py --test 1,2,3,4
Namespace(positional='1,2,3,4', test=True)
$ python example.py --test -1,2,3,4
usage: example.py [-h] [-t] positional
example.py: error: too few arguments
$ python example.py --test "-1,2,3,4"
usage: example.py [-h] [-t] positional
example.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
我见过人们建议除了-作为旗帜角色之外还使用其他一些角色,但我宁愿不这样做.是否有另一种方法来配置argparse以允许两个--test和-1,2,3,4作为有效参数?
我在我的脚本中使用argparse.ArgumentParser(),我想显示我的脚本的pydoc描述作为argparse的' - help'选项的一部分.
一种可能的解决方案是使用ArgumentParser 的formatter_class或description属性来配置帮助的显示.但在这种情况下,我们需要在内部使用'pydoc'命令来获取描述.
我们还有其他方法(可能是优雅的)吗?
import argparse
parser = argparse.ArgumentParser(description='sort given numbers')
parser.add_argument('-s', nargs = '+', type = int)
args = parser.parse_args()
print(args)
Run Code Online (Sandbox Code Playgroud)
在命令行上运行命令时
python3 file_name.py -s 9 8 76
它打印
Namespace(s=[9, 8, 76]).
如何访问列表[9,8,76]?什么是命名空间对象.我在哪里可以了解更多信息?
我有一点问题.
我argparse用来解析我的论点,而且它运作得很好.
有了args,我这样做:
p_args = parser.parse_args(argv)
args = dict(p_args._get_kwargs())
Run Code Online (Sandbox Code Playgroud)
但问题p_args是我不知道如何通过它们在命令行中的位置来排序这些参数,因为它是一个字典.
那么有没有可能在命令行中按顺序在元组/列表/有序字典中包含参数?
我正在使用Argparse编写一个命令行实用程序,并添加了一堆sub_parsers(子命令).在帮助菜单中,它们出现在一个名为"命令"的组下面,我得到了一个很好的列表,列出了所有可能的选项.但是,在此列表出现之前,所有相同的命令都显示在大括号中的组标题下,如下所示:
Commands:
{foo, bar}
foo - foo does foo
bar - bar does bar
Run Code Online (Sandbox Code Playgroud)
我想删除大括号中出现的冗余条目.它只出现在这个充满sub_parsers的组中.
我处理它的代码如下所示:(其中解析器是ArgumentParser()实例)
subparsers = parser.add_subparsers(title="Commands")
foo = subparsers.add_parser("foo", help="- foo does foo")
bar = subparsers.add_parser("bar", help="- bar does bar")
Run Code Online (Sandbox Code Playgroud)
我已经查看了我的命令操作组的属性和方法,似乎无法找到任何可以解决这个问题的方法(至少从我能理解的方面).我不确定是否还有其他人处理过此事,我意识到这可能有点模糊.而且,我要做的就是找到删除大括号中出现的命令的冗余列表的方法.
我最近参与了一些python项目,并且在pip没有安装某些要求的最新版本时遇到了很多问题.我在osx和我用brew安装Python 2.7.6.在我正在研究的项目中,我们只是pip install -r requirements.txt.在目前的情况下,我需要安装argparse==1.2.1.这是pypi网站上显示的实际最新版本
这是我的输出
Downloading/unpacking argparse==1.2.1 (from -r requirements.txt (line 4))
Could not find a version that satisfies the requirement argparse==1.2.1 (from -r requirements.txt (line 4)) (from versions: 0.1.0, 0.2.0, 0.3.0, 0.4.0, 0.5.0, 0.6.0, 0.7.0, 0.8.0, 0.9.0, 0.9.1, 1.0.1, 1.0, 1.1)
Some externally hosted files were ignored (use --allow-external to allow).
Cleaning up...
No distributions matching the version for argparse==1.2.1 (from -r requirements.txt …Run Code Online (Sandbox Code Playgroud)