除了修改argparse源代码外,如果parse_args()在调用时遇到问题,有没有办法控制退出状态代码,例如,缺少必需的开关?
我编写了一些使用argparse模块的Python 2.7代码.现在我需要在Python 2.6机器上运行它,因为在2.7中添加了argparse,它将无法工作.
无论如何我可以在2.6中获得argparse吗?我想避免重写代码,因为我会经常在机器之间传输这种代码.升级python不是一个选择.
我应该澄清一下,理想的解决方案是不需要安装模块的东西.
我正在创建一个python脚本,我希望有一个参数来操作你输出的搜索结果数量.我现在已经命名了这个论点--head.这是我希望它拥有的功能:
如果--head没有在命令行传递,我希望它默认为一个值.在这种情况下,一个相当大的,像80
当--head没有任何值传递时,我希望它默认为另一个值.在这种情况下,有限的东西,如10
当--head传递一个值时,我希望它存储它传递的值.
以下是一些描述问题的代码:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-h',
'--head',
dest='size',
const=80,
default=10,
action="I don't know",
help='Only print the head of the output')
>>> # OFC, that last line will fail because the action is uknown,
... # but here is how I'd like it to work
... parser.parse_args(''.split())
Namespace(size=80)
>>> parser.parse_args('--head'.split())
Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
Namespace(size=15)
Run Code Online (Sandbox Code Playgroud)
我知道我可能会为此编写自定义操作,但我首先想看看是否有任何默认行为.
我有一个脚本,它具有某些选项,可以在命令行上传递,也可以从环境变量传递.如果两者都存在,则CLI应该优先,如果两者都没有,则会发生错误.
我可以检查解析后是否分配了该选项,但我更喜欢让argparse执行繁重的工作并负责在解析失败时显示用法语句.
我已经提出了几种替代方法(我将在下面作为答案发布,以便可以单独讨论),但他们觉得我很笨,我认为我错过了一些东西.
是否有一种被接受的"最佳"方式?
(编辑以在未设置CLI选项和环境变量时清除所需的行为)
我正在尝试学习如何使用python的argparse模块.目前我的python脚本是:
parser = argparse.ArgumentParser(description='My first argparse attempt',
add_help=True)
parser.add_argument("-q", action ="store", dest='argument',
help="First argument")
output = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
它将输出提供为:
usage: test.py [-h] [-q ARGUMENT]
My first argparse attempt
optional arguments:
-h, --help show this help message and exit
-q ARGUMENT First argument
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设我希望我的-h or --help论点也打印出来usage example.喜欢,
Usage: python test.py -q "First Argument for test.py"
Run Code Online (Sandbox Code Playgroud)
我的目的是打印上面的用法示例以及-h参数的默认内容,以便用户可以基本了解如何使用test.pypython脚本.
那么,这个功能是否在argparse模块中内置.如果不是什么是正确的方法来解决这个问题.
我不认为这是可能的,但我想自己处理来自argparse的异常.
例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
args = parser.parse_args()
except:
do_something()
Run Code Online (Sandbox Code Playgroud)
当我运行它:
$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required
Run Code Online (Sandbox Code Playgroud)
但我希望它落入例外.
我正在尝试使用参数解析器来解析3D坐标,以便我可以使用
--cord 1,2,3 2,4,6 3,6,9
Run Code Online (Sandbox Code Playgroud)
得到
((1,2,3),(2,4,6),(3,6,9))
Run Code Online (Sandbox Code Playgroud)
我的尝试是
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--cord', help="Coordinate", dest="cord", type=tuple, nargs=3)
args = parser.parse_args(["--cord","1,2,3","2,4,6","3,6,9"])
vars(args)
{'cord': [('1', ',', '2', ',', '3'),
('2', ',', '4', ',', '6'),
('3', ',', '6', ',', '9')]}
Run Code Online (Sandbox Code Playgroud)
替换逗号会是什么?
我希望能够通过向命令行添加更多-v选项来指定不同的详细级别.例如:
$ myprogram.py
$ myprogram.py -v
$ myprogram.py -vv
$ myprogram.py -v -v -v
Run Code Online (Sandbox Code Playgroud)
会导致verbose = 0,verbose = 1,verbose = 2,verbose = 3.如何使用argparse实现这一目标?
可选地,它也可以很好地指定它
$ myprogram -v 2
Run Code Online (Sandbox Code Playgroud) 如何argparse在Python脚本中使用shell选项卡完成协作?
#!/usr/bin/env python
import argparse
def main(**args):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('positional', choices=['spam', 'eggs'])
parser.add_argument('--optional', choices=['foo1', 'foo2', 'bar'])
args = parser.parse_args()
main(**vars(args))
Run Code Online (Sandbox Code Playgroud)
在.py文件上设置可执行标志后,预期结果应为:
$ ./example.py sp<tab>
-> completes to "./example.py spam"
$ ./example.py --op<tab>
-> completes to "./example.py --optional"
$ ./example.py --optional b<tab>
-> completes to "./example.py --optional bar"
$ ./example.py --optional f<tab>
-> completes to "./example.py --optional foo"
and, additionally, prints "foo1 foo2" choices on stdout on a new line
Run Code Online (Sandbox Code Playgroud) 在argparse中指定程序名称和版本信息的首选方法是什么?
__version_info__ = ('2013','03','14')
__version__ = '-'.join(__version_info__)
...
parser.add_argument('-V', '--version', action='version', version="%(prog)s ("+__version__+")")