如何读取/处理命令行参数?

我原本是C程序员。 我已经看到无数的技巧和“黑客”来阅读许多不同的论点。

Python程序员可以做些什么?

有关

  • 抓取/parsing传递给Python脚本的命令行参数的最好方法是什么?
  • 实现一个“[command] [action] [parameter]”风格的命令行界面?
  • 我如何在Python中处理命令行参数?
  • 如何使用Python的optparse格式化位置参数帮助?

注意,optparse在Python 2.7版本中已被弃用:

http://docs.python.org/2/library/optparse.htmlargparse是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_ACTIONSCHECK_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