我原来是一名C程序员.我已经看过许多技巧和"黑客"来阅读许多不同的论点.
Python程序员可以通过哪些方式实现这一目标?
获取/解析传递给Python脚本的命令行参数的最佳方法是什么?
实现"[command] [action] [parameter]"样式命令行界面?
如何在Python中处理命令行参数?
如何使用Python的optparse格式化位置参数帮助?
John Slavick.. 526
import sys print("\n".join(sys.argv))
sys.argv
是一个列表,其中包含在命令行上传递给脚本的所有参数.
基本上,
import sys print(sys.argv[1:])
对于非常简单的东西,这是要走的路,尽管你可能只想使用`sys.argv [1:]`(避免脚本名称). (79认同)
它在Python 2.7.13上运行时有效 (6认同)
Ayman Hourie.. 433
标准库中的规范解决方案是argparse
(docs):
这是一个例子:
from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_argument("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") args = parser.parse_args()
argparse
支持(除其他外):
任何顺序的多个选项.
短期和长期期权.
默认值.
生成使用帮助消息.
Python文档建议使用[argparse](http://docs.python.org/library/argparse.html#module-argparse)而不是optparse. (54认同)
是的,这些是最好的.由于它们是标准库的一部分,因此您可以确定它们是可用的并且易于使用.optparse尤其强大而且容易. (27认同)
在这一点上(12/2011),argparse现在被认为是比optparse更好的选择,对吗? (12认同)
由于`optparse`已被弃用,问题的提问者不再是堆栈溢出的成员,这是一个非常明显的问题的接受答案 - 请考虑完全重写您的示例代码以使用stdlib`argparse`. (7认同)
optparse是最好的之一; getopt很旧,真的应该被认为是弃用的. (4认同)
这些内置模块最好吗?或者你能想到更好的定制方式吗? (2认同)
Silfheed.. 126
只是为argparse传福音,这对于这些原因更好..本质上:
(从链接复制)
argparse模块可以处理位置和可选参数,而optparse只能处理可选参数
argparse对于你的命令行界面应该是什么样子并不是教条主义 - 支持像-file或/ file这样的选项,以及必需的选项.Optparse拒绝支持这些功能,更喜欢纯度而非实用性
argparse生成更多信息性使用消息,包括根据参数确定的命令行用法,以及有关位置参数和可选参数的帮助消息.optparse模块要求您编写自己的用法字符串,并且无法显示位置参数的帮助.
argparse支持使用可变数量的命令行参数的操作,而optparse需要事先知道确切的参数数量(例如1,2或3)
argparse支持调度到子命令allow_interspersed_args
的解析器,而optparse需要手动设置
和执行解析器调度
而我个人的最爱:
argparse允许add_argument()
使用简单的callables指定类型和操作参数,而optparse需要黑客类属性,如
STORE_ACTIONS
或CHECK_METHODS
获得正确的参数检查
从2.7和3.2开始,这是标准Python的一部分:) (27认同)
@osman这个关于argparse的温和[教程](https://docs.python.org/3/howto/argparse.html)可能会有所帮助...... (2认同)
@ArtOfWarfare在此上下文中的“可选参数”大概是指用类似选项的参数(例如-f或--foo)指定的参数,而“事先知道确切数量的参数”大概是指在没有任何前面的情况下给出的位置参数选项标志。 (2认同)
jfs.. 67
还有argparse
stdlib模块(stdlib模块上的"impovement" optparse
).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
@ blitu12345在我的回答发表时,没有任何其他答案提到argparse以任何方式.模块本身不在stdlib中你对文档中的代码示例有什么看法?为什么您认为有必要提出自己的示例而不是模块作者提供的示例?而且我不喜欢纯链接的答案(我并不孤单). (3认同)
JPCosta.. 49
一种方法是使用sys.argv
.这将打印脚本名称作为第一个参数以及传递给它的所有其他参数.
import sys for arg in sys.argv: print arg
ralbatross.. 49
该docopt库是真的光滑.它根据您应用的使用字符串构建参数dict.
例如来自docopt自述文件:
"""Naval Fate. Usage: naval_fate.py ship new... naval_fate.py ship move [--speed= ] naval_fate.py ship shoot naval_fate.py mine (set|remove) [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed= 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)
这已经迅速成为我最喜欢的方式.它是字符串解析所以它有点脆弱,但它在一个地方很脆弱_你可以在http://try.docopt.org上预览你的逻辑.可选和互斥的参数以非常优雅的方式完成. (4认同)
我迫切希望看到naval_fate.py的其余代码 (4认同)
Kent Munthe .. 46
如果你需要快速而不灵活的东西
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
产生以下输出:
詹姆斯史密斯你好
我不同意我的用法不太现实.假设您的程序需要知道一个人的确切名字和姓氏,以便在人们可以拥有多个名字和姓氏的商家中运行该脚本?如果詹姆斯史密斯将约瑟夫作为一个额外的名字或姓氏,如果你只做`python main.py"詹姆斯约瑟夫史密斯",怎么能区分约瑟夫是一个额外的名字还是姓?如果您关心索引超出范围,可以添加对提供的参数数量的检查.不太现实,我的例子展示了如何处理多个参数. (10认同)
whi.. 26
#set default args as -h , if no args: if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
Van Gale.. 19
我自己使用optparse,但非常喜欢Simon Willison在他最近推出的optfunc库中采用的方向.它的工作原理是:
"内省函数定义(包括其参数及其默认值)并使用它来构造命令行参数解析器."
所以,例如,这个函数定义:
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
小智.. 8
我喜欢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...")
最近我一直在包装类似的东西,以减少冗长(例如;隐含"-h").
import sys print("\n".join(sys.argv))
sys.argv
是一个列表,其中包含在命令行上传递给脚本的所有参数.
基本上,
import sys print(sys.argv[1:])
标准库中的规范解决方案是argparse
(docs):
这是一个例子:
from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_argument("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") args = parser.parse_args()
argparse
支持(除其他外):
任何顺序的多个选项.
短期和长期期权.
默认值.
生成使用帮助消息.
只是为argparse传福音,这对于这些原因更好..本质上:
(从链接复制)
argparse模块可以处理位置和可选参数,而optparse只能处理可选参数
argparse对于你的命令行界面应该是什么样子并不是教条主义 - 支持像-file或/ file这样的选项,以及必需的选项.Optparse拒绝支持这些功能,更喜欢纯度而非实用性
argparse生成更多信息性使用消息,包括根据参数确定的命令行用法,以及有关位置参数和可选参数的帮助消息.optparse模块要求您编写自己的用法字符串,并且无法显示位置参数的帮助.
argparse支持使用可变数量的命令行参数的操作,而optparse需要事先知道确切的参数数量(例如1,2或3)
argparse支持调度到子命令allow_interspersed_args
的解析器,而optparse需要手动设置
和执行解析器调度
而我个人的最爱:
argparse允许add_argument()
使用简单的callables指定类型和操作参数,而optparse需要黑客类属性,如
STORE_ACTIONS
或CHECK_METHODS
获得正确的参数检查
还有argparse
stdlib模块(stdlib模块上的"impovement" optparse
).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库是真的光滑.它根据您应用的使用字符串构建参数dict.
例如来自docopt自述文件:
"""Naval Fate. Usage: naval_fate.py ship new... naval_fate.py ship move [--speed= ] naval_fate.py ship shoot naval_fate.py mine (set|remove) [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed= 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)
如果你需要快速而不灵活的东西
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
产生以下输出:
詹姆斯史密斯你好
#set default args as -h , if no args: if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
我自己使用optparse,但非常喜欢Simon Willison在他最近推出的optfunc库中采用的方向.它的工作原理是:
"内省函数定义(包括其参数及其默认值)并使用它来构造命令行参数解析器."
所以,例如,这个函数定义:
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
我喜欢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...")
最近我一直在包装类似的东西,以减少冗长(例如;隐含"-h").
正如您所见,optparse "不推荐使用optparse模块,不会进一步开发;继续使用argparse模块进行开发."
Pocoo的点击更直观,需要更少的样板,并且至少与argparse一样强大.
到目前为止我遇到的唯一弱点是你不能做很多自定义来帮助页面,但这通常不是一个要求,docopt似乎是明确的选择.
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