当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何读取/处理命令行参数?》经验,为你挑选了13个好方法。

我原来是一名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_ACTIONSCHECK_METHODS获得正确的参数检查

从2.7和3.2开始,这是标准Python的一部分:) (27认同)

@osman这个关于argparse的温和[教程](https://docs.python.org/3/howto/argparse.html)可能会有所帮助...... (2认同)

@ArtOfWarfare在此上下文中的“可选参数”大概是指用类似选项的参数(例如-f或--foo)指定的参数,而“事先知道确切数量的参数”大概是指在没有任何前面的情况下给出的位置参数选项标志。 (2认同)


jfs.. 67

还有argparsestdlib模块(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").



1> John Slavick..:
import sys

print("\n".join(sys.argv))

sys.argv 是一个列表,其中包含在命令行上传递给脚本的所有参数.

基本上,

import sys
print(sys.argv[1:])


对于非常简单的东西,这是要走的路,尽管你可能只想使用`sys.argv [1:]`(避免脚本名称).
它在Python 2.7.13上运行时有效

2> Ayman Hourie..:

标准库中的规范解决方案是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.
是的,这些是最好的.由于它们是标准库的一部分,因此您可以确定它们是可用的并且易于使用.optparse尤其强大而且容易.
在这一点上(12/2011),argparse现在被认为是比optparse更好的选择,对吗?
由于`optparse`已被弃用,问题的提问者不再是堆栈溢出的成员,这是一个非常明显的问题的接受答案 - 请考虑完全重写您的示例代码以使用stdlib`argparse`.
optparse是最好的之一; getopt很旧,真的应该被认为是弃用的.
这些内置模块最好吗?或者你能想到更好的定制方式吗?

3> Silfheed..:

只是为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_ACTIONSCHECK_METHODS获得正确的参数检查


从2.7和3.2开始,这是标准Python的一部分:)
@osman这个关于argparse的温和[教程](https://docs.python.org/3/howto/argparse.html)可能会有所帮助......
@ArtOfWarfare在此上下文中的“可选参数”大概是指用类似选项的参数(例如-f或--foo)指定的参数,而“事先知道确切数量的参数”大概是指在没有任何前面的情况下给出的位置参数选项标志。

4> jfs..:

还有argparsestdlib模块(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中你对文档中的代码示例有什么看法?为什么您认为有必要提出自己的示例而不是模块作者提供的示例?而且我不喜欢纯链接的答案(我并不孤单).

5> JPCosta..:

一种方法是使用sys.argv.这将打印脚本名称作为第一个参数以及传递给它的所有其他参数.

import sys

for arg in sys.argv:
    print arg



6> ralbatross..:

该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上预览你的逻辑.可选和互斥的参数以非常优雅的方式完成.
我迫切希望看到naval_fate.py的其余代码

7> Kent Munthe ..:

如果你需要快速而不灵活的东西

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"詹姆斯约瑟夫史密斯",怎么能区分约瑟夫是一个额外的名字还是姓?如果您关心索引超出范围,可以添加对提供的参数数量的检查.不太现实,我的例子展示了如何处理多个参数.

8> whi..:
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]



9> Van Gale..:

我自己使用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



10> 小智..:

我喜欢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").



11> tverrbjelke..:

正如您所见,optparse "不推荐使用optparse模块,不会进一步开发;继续使用argparse模块进行开发."



12> Ryne Everett..:

Pocoo的点击更直观,需要更少的样板,并且至少与argparse一样强大.

到目前为止我遇到的唯一弱点是你不能做很多自定义来帮助页面,但这通常不是一个要求,docopt似乎是明确的选择.



13> JON..:
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

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有