如何读取/处理命令行参数?
我原本是C程序员。 我已经看到无数的技巧和“黑客”来阅读许多不同的论点。
Python程序员可以做些什么?
有关
- 抓取/parsing传递给Python脚本的命令行参数的最好方法是什么?
- 实现一个“[command] [action] [parameter]”风格的命令行界面?
- 我如何在Python中处理命令行参数?
- 如何使用Python的optparse格式化位置参数帮助?
请注意,optparse在Python 2.7版本中已被弃用:
http://docs.python.org/2/library/optparse.html 。 argparse是replace: http : //docs.python.org/2/library/argparse.html#module-argparse
标准库中有以下模块:
- getopt模块类似于GNU getopt。
- optparse模块提供了面向对象的命令行选项parsing。
以下是一个使用文档中后者的示例:
from optparse import OptionParser parser = OptionParser() parser.add_option("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") (options, args) = parser.parse_args()
optparse支持(除其他外):
- 以任何顺序的多个选项。
- 短期和长期的select。
- 默认值。
- 生成使用帮助消息。
import sys print "\n".join(sys.argv)
sys.argv
是一个包含在命令行sys.argv
脚本的所有参数的列表。
基本上,
import sys print sys.argv[1:]
只是四处传福音,这是更好的原因。实质上:
(从链接复制)
-
argparse模块可以处理位置参数和可选参数,而optparse只能处理可选参数
-
argparse对于你的命令行界面应该是什么样子并不是教条式的 – 像-file或/ file这样的选项是必须的。 Optparse拒绝支持这些function,宁愿纯粹超过实用性
-
argparse会生成更多的信息性用法消息,包括从您的参数中确定的命令行用法,以及用于位置参数和可选参数的帮助消息。 optparse模块要求您编写自己的使用string,并且无法显示位置参数的帮助。
-
argparse支持使用可变数量的命令行参数的操作,而optparse则要求事先知道参数的确切数量(例如1,2或3)
-
argparse支持调度到子命令的parsing器,而optparse则需要设置
allow_interspersed_args
并手动执行parsing器调度
而我个人的最爱:
- argparse允许types和动作参数
add_argument()
用简单的add_argument()
参数指定,而optparse则需要像STORE_ACTIONS
或CHECK_METHODS
这样的黑客类属性来获得适当的参数检查
还有一个argparse
stdlib模块 (stdlib的optparse
模块上的“impovement”)。 从引入到argparse的例子:
# script.py import argparse if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( 'integers', metavar='int', type=int, choices=range(10), nargs='+', help='an integer in the range 0..9') parser.add_argument( '--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers))
用法:
$ script.py 1 2 3 4 4 $ script.py --sum 1 2 3 4 10
一种方法是使用sys.argv
。 这将打印脚本名称作为第一个参数和您传递给它的所有其他参数。
import sys for arg in sys.argv: print arg
docopt库真的很漂亮。 它从您的应用程序的用法string构build一个参数字典。
例如从docopt自述:
"""Naval Fate. Usage: naval_fate.py ship new <name>... naval_fate.py ship <name> move <x> <y> [--speed=<kn>] naval_fate.py ship shoot <x> <y> naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed=<kn> Speed in knots [default: 10]. --moored Moored (anchored) mine. --drifting Drifting mine. """ from docopt import docopt if __name__ == '__main__': arguments = docopt(__doc__, version='Naval Fate 2.0') print(arguments)
#set default args as -h , if no args: if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
我自己使用optparse,但真正喜欢Simon Willison最近推出的optfunc库的方向。 它的工作原理是:
“内省一个函数定义(包括它的参数和它们的默认值)并使用它来构造一个命令行参数parsing器”。
所以,例如,这个函数定义:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
变成这个optparse帮助文本:
Options: -h, --help show this help message and exit -l, --list-geocoders -a API_KEY, --api-key=API_KEY -g GEOCODER, --geocoder=GEOCODER
如果你需要快速而不灵活的东西
main.py:
import sys first_name = sys.argv[1] last_name = sys.argv[2] print("Hello " + first_name+ " " + last_name )
然后运行python main.py James Smith
产生以下输出:
你好詹姆斯史密斯
我喜欢stdlib getopt,例如:
try: opts, args = getopt.getopt(sys.argv[1:], 'h', ['help']) except getopt.GetoptError, err: usage(err) for opt, arg in opts: if opt in ('-h', '--help'): usage() if len(args) != 1: usage("specify thing...")
最近我一直在包装一些类似的东西,以减less冗长(例如,使“-h”隐含)。
正如你所看到的, optparse “optparse模块已经被弃用,不会被进一步开发;开发将继续使用argparse模块。”
你可能会对我写的一个小的Python模块感兴趣,使命令行参数的处理更容易(开源和免费使用) – Commando
我build议把docopt作为这些其他的简单替代scheme。
docopt是一个新的项目,通过parsing你的–help用法消息而不是要求你自己实现所有的东西。 你只需要把你的使用信息以POSIX格式。
Pocoo的点击更直观,需要更less的样板,至less和argparse一样强大。
到目前为止我遇到的唯一的弱点是你不能做很多的定制来帮助页面,但通常不是要求, docopt似乎是明确的select。
还有一个select是argh 。 它build立在argparse上,可以让你写下如下的东西:
import argh # declaring: def echo(text): "Returns given word as is." return text def greet(name, greeting='Hello'): "Greets the user with given name. The greeting is customizable." return greeting + ', ' + name # assembling: parser = argh.ArghParser() parser.add_commands([echo, greet]) # dispatching: if __name__ == '__main__': parser.dispatch()
它会自动生成帮助等等,你可以使用装饰器来提供额外的argparsing应该如何工作的指导。
我的解决scheme是入口点2 。 例:
from entrypoint2 import entrypoint @entrypoint def add(file, quiet=True): ''' This function writes report. :param file: write report to FILE :param quiet: don't print status messages to stdout ''' print file,quiet
帮助文字:
usage: report.py [-h] [-q] [--debug] file This function writes report. positional arguments: file write report to FILE optional arguments: -h, --help show this help message and exit -q, --quiet don't print status messages to stdout --debug set logging level to DEBUG
import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers)) Assuming the Python code above is saved into a file called prog.py $ python prog.py -h Ref-link: https://docs.python.org/3.3/library/argparse.html