解析Python命令行参数最简单、最简洁、最灵活的方法或库是什么?
当前回答
值得一提的是主机游戏。它很容易使用。看看吧:
from consoleargs import command
@command
def main(url, name=None):
"""
:param url: Remote URL
:param name: File name
"""
print """Downloading url '%r' into file '%r'""" % (url, name)
if __name__ == '__main__':
main()
现在在控制台:
% python demo.py --help
Usage: demo.py URL [OPTIONS]
URL: Remote URL
Options:
--name -n File name
% python demo.py http://www.google.com/
Downloading url ''http://www.google.com/'' into file 'None'
% python demo.py http://www.google.com/ --name=index.html
Downloading url ''http://www.google.com/'' into file ''index.html''
其他回答
Argparse代码可能比实际实现代码还要长!
这是我在大多数流行参数解析选项中发现的一个问题,如果您的参数只是适度的,那么用于记录它们的代码就会变得与它们所提供的好处不成比例地大。
对参数解析场景来说(我认为)一个相对的新来者是plac。
它与argparse做了一些公认的权衡,但使用内联文档并简单地包装main()类型函数:
def main(excel_file_path: "Path to input training file.",
excel_sheet_name:"Name of the excel sheet containing training data including columns 'Label' and 'Description'.",
existing_model_path: "Path to an existing model to refine."=None,
batch_size_start: "The smallest size of any minibatch."=10.,
batch_size_stop: "The largest size of any minibatch."=250.,
batch_size_step: "The step for increase in minibatch size."=1.002,
batch_test_steps: "Flag. If True, show minibatch steps."=False):
"Train a Spacy (http://spacy.io/) text classification model with gold document and label data until the model nears convergence (LOSS < 0.5)."
pass # Implementation code goes here!
if __name__ == '__main__':
import plac; plac.call(main)
这个答案建议optparse适用于较旧的Python版本。对于Python 2.7及以上版本,argparse替换optparse。更多信息请看这个答案。
正如其他人指出的那样,您最好使用optparse而不是getopt。getopt基本上是标准getopt(3) C库函数的一对一映射,不太容易使用。
Optparse虽然有点冗长,但结构更好,以后更容易扩展。
下面是向解析器添加选项的典型行:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
它本身就说明了一切;在处理时,它将接受-q或——query作为选项,将参数存储在一个名为query的属性中,如果您没有指定它,则有一个默认值。它也是自文档化的,因为你在选项中声明了help参数(在使用-h/——help时使用)。
通常你会这样分析你的论点:
options, args = parser.parse_args()
默认情况下,这将解析传递给脚本的标准参数(sys.argv[1:])
选项。Query将被设置为您传递给脚本的值。
只需执行以下操作即可创建解析器
parser = optparse.OptionParser()
这些都是你需要的基本知识。下面是一个完整的Python脚本:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5行python代码告诉你基本原理。
将其保存在sample.py中,并使用
python sample.py
有一次
python sample.py --query myquery
除此之外,您会发现optparse非常容易扩展。 在我的一个项目中,我创建了一个命令类,它允许您轻松地在命令树中嵌套子命令。它大量使用optparse将命令链接在一起。我不能用几行话就解释清楚,但是可以在存储库中随意浏览主类,以及使用它的类和选项解析器
Argparse是正确的方法。下面是如何使用它的简短总结:
1)初始化
import argparse
# Instantiate the parser
parser = argparse.ArgumentParser(description='Optional app description')
2)添加论据
# Required positional argument
parser.add_argument('pos_arg', type=int,
help='A required integer positional argument')
# Optional positional argument
parser.add_argument('opt_pos_arg', type=int, nargs='?',
help='An optional integer positional argument')
# Optional argument
parser.add_argument('--opt_arg', type=int,
help='An optional integer argument')
# Switch
parser.add_argument('--switch', action='store_true',
help='A boolean switch')
3)解析
args = parser.parse_args()
4)访问
print("Argument values:")
print(args.pos_arg)
print(args.opt_pos_arg)
print(args.opt_arg)
print(args.switch)
5)检查价值
if args.pos_arg > 10:
parser.error("pos_arg cannot be larger than 10")
使用
正确使用方法:
$ ./app 1 2 --opt_arg 3 --switch
Argument values:
1
2
3
True
不正确的参数:
$ ./app foo 2 --opt_arg 3 --switch
usage: convert [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
app: error: argument pos_arg: invalid int value: 'foo'
$ ./app 11 2 --opt_arg 3
Argument values:
11
2
3
False
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
convert: error: pos_arg cannot be larger than 10
完整的帮助:
$ ./app -h
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
Optional app description
positional arguments:
pos_arg A required integer positional argument
opt_pos_arg An optional integer positional argument
optional arguments:
-h, --help show this help message and exit
--opt_arg OPT_ARG An optional integer argument
--switch A boolean switch
几乎每个人都在使用getopt
下面是文档的示例代码:
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
output = None
verbose = False
for o, a in opts:
if o == "-v":
verbose = True
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-o", "--output"):
output = a
总之,这就是它的工作原理。
你有两种选择。一种是接受辩论的,另一种是接受辩论的 就像开关一样。
sys。argv基本上就是你C语言中的char** argv。就像在C语言中,你跳过第一个元素,也就是你程序的名字,只解析参数:
Getopt。Getopt将根据参数中给出的规则解析它。
这里的"ho:v"描述了短参数:- onletter。:表示-o接受一个参数。
最后["help", "output="]描述长参数(——morethanonletter)。 输出后的=再次表示输出接受一个参数。
结果是一对(选项,参数)的列表
如果一个选项不接受任何参数(比如help), arg部分就是一个空字符串。 然后,您通常希望在此列表上进行循环,并像示例中那样测试选项名称。
我希望这对你有所帮助。
使用标准库附带的optparse。例如:
#!/usr/bin/env python
import optparse
def main():
p = optparse.OptionParser()
p.add_option('--person', '-p', default="world")
options, arguments = p.parse_args()
print 'Hello %s' % options.person
if __name__ == '__main__':
main()
来源:使用Python创建UNIX命令行工具
然而,从Python 2.7开始,optparse已弃用,请参阅:为什么使用argparse而不是optparse?
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从终端/命令行调用VS代码编辑器
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 在Jar文件中运行类
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式