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

时间:2009-06-17 22:38:30

标签: python command-line command-line-arguments

18 个答案:

答案 0 :(得分:492)

import sys

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

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

基本上,

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

答案 1 :(得分:379)

标准库中的规范解决方案是argparsedocs):

以下是一个例子:

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支持(除其他外):

  • 任何顺序的多个选项。
  • 短期和长期期权。
  • 默认值。
  • 生成使用帮助信息。

答案 2 :(得分:125)

argparse传播福音,这对于these原因更好..本质上:

(从链接中复制)

  • argparse模块可以处理位置 和可选参数,而 optparse只能处理可选项 参数

  • argparse不是教条主义者 你的命令行界面是什么 看起来应该像-file这样的选项 支持或/文件 必需的选项。 Optparse拒绝 支持这些功能,更喜欢 纯度超过实用性

  • argparse产生更多 信息用法信息,包括 命令行使用情况确定 你的论点和帮助信息 位置和可选 参数。 optparse模块 要求您编写自己的用法 字符串,无法显示 帮助进行位置论证。

  • argparse支持行动 消耗可变数量的 命令行参数,而optparse 要求确切的数量 参数(例如1,2或3)是已知的 提前

  • argparse支持解析器 发送到子命令,而 optparse需要设置 allow_interspersed_args并做了 解析器手动调度

我个人的最爱:

  • argparse允许类型和 add_argument()的动作参数 用简单的方式来指定 callables,而optparse需要 黑客类属性就像 得到STORE_ACTIONSCHECK_METHODS 适当的参数检查

答案 3 :(得分:65)

还有argparse stdlib module(stdlib optparse模块的“改进”)。 the introduction to 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

答案 4 :(得分:48)

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

import sys

for arg in sys.argv:
    print arg

答案 5 :(得分:46)

docopt库真的很光滑。它根据您应用的使用字符串构建参数dict。

例如来自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)

答案 6 :(得分:38)

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

<强> 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

产生以下输出:

  

你好詹姆斯史密斯

答案 7 :(得分:24)

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

答案 8 :(得分: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

答案 9 :(得分: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”)。

答案 10 :(得分:7)

正如您所见optparse“不推荐使用optparse模块,不会进一步开发;将继续开发argparse模块。”

答案 11 :(得分:7)

Pocoo的click更直观,需要更少的样板,并且至少与argparse一样强大。

我到目前为止遇到的唯一弱点是你无法进行太多自定义来帮助页面,但这通常不是必需的,而docopt似乎是明确的选择。它是。

答案 12 :(得分:4)

我建议将docopt视为这些其他人的简单替代方案。

docopt是一个新项目,它通过解析您的--help用法消息而不是要求您自己实现所有内容来工作。您只需将使用消息放在POSIX格式中即可。

答案 13 :(得分:4)

您可能对我编写的一些Python模块感兴趣,以便更轻松地处理命令行参数(开源和免费使用) - Commando

答案 14 :(得分:3)

另一种选择是argh。它建立在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()

它会自动生成帮助等等,你可以使用装饰器来提供关于arg-parsing应该如何工作的额外指导。

答案 15 :(得分:3)

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

答案 16 :(得分:0)

另外,对于python3,您可能会发现使用扩展可迭代解压缩来方便地处理可选的位置参数而没有其他依赖性:

try:
   _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
except ValueError:
   print("Not enough arguments", file=sys.stderr) # unhandled exception traceback is meaningful enough also
   exit(-1)

以上argv的解压缩使arg2arg3为“可选”-如果未在argv中指定,则它们将为None,而如果第一个不是指定,ValueError将被抛出:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
ValueError: not enough values to unpack (expected at least 4, got 3)

答案 17 :(得分:0)

我的解决方案是entrypoint2。例如:

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