Joh*_*ick 526

import sys

print("\n".join(sys.argv))
Run Code Online (Sandbox Code Playgroud)

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

基本上,

import sys
print(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

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

Aym*_*ieh 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()
Run Code Online (Sandbox Code Playgroud)

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认同)
  • @edgerA:“更好的自定义方式”是什么意思? (2认同)
  • @AymanHourieh 你没有展示如何获得这些参数。这个模块的文档很乱。 (2认同)

Sil*_*eed 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认同)
  • 什么是“可选参数”?你说它们在 optparse 中。我认为它们是可能提供也可能不提供的参数,但您说它们在 optparse 中,同时继续说“optparse 要求提前知道参数的确切数量”。因此,要么你对“可选参数”的定义与我的想法不同,要么你的答案与本身不一致。 (2认同)
  • 只是抱怨:argparse 文档也非常、非常复杂。对于“如何使命令行参数接受单个值以及如何访问该值”,您无法得到简单的答案。</抱怨> (2认同)
  • @osman这个关于argparse的温和[教程](https://docs.python.org/3/howto/argparse.html)可能会有所帮助...... (2认同)
  • @ArtOfWarfare在此上下文中的“可选参数”大概是指用类似选项的参数(例如-f或--foo)指定的参数,而“事先知道确切数量的参数”大概是指在没有任何前面的情况下给出的位置参数选项标志。 (2认同)

jfs*_*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))
Run Code Online (Sandbox Code Playgroud)

用法:

$ script.py 1 2 3 4
4

$ script.py --sum 1 2 3 4
10
Run Code Online (Sandbox Code Playgroud)

  • “来到这里的人们已经对文档中的内容有了一个想法” - 我_高度_怀疑这个假设。不知何故。 (8认同)
  • @ blitu12345在我的回答发表时,没有任何其他答案提到argparse以任何方式.模块本身不在stdlib中你对文档中的代码示例有什么看法?为什么您认为有必要提出自己的示例而不是模块作者提供的示例?而且我不喜欢纯链接的答案(我并不孤单). (3认同)
  • 它只是一个复制和粘贴 (2认同)
  • 来到这里的人们已经知道文档中的内容,并且只会在这里进一步了解该主题。我的情况也是如此,但我在这里真正找到的是原始文档的复制和粘贴。和平! (2认同)
  • 我发现很难弄清楚如何实际使用解析结果。在这个答案中,这个问题在最后一行代码中得到解决(所以+1)。但说实话,这个例子非常紧凑,可能远远超出了询问处理命令行参数的人的能力。 (2认同)

JPC*_*sta 49

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

import sys

for arg in sys.argv:
    print arg
Run Code Online (Sandbox Code Playgroud)


ral*_*oss 49

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)
Run Code Online (Sandbox Code Playgroud)

  • 这已经迅速成为我最喜欢的方式.它是字符串解析所以它有点脆弱,但它在一个地方很脆弱_你可以在http://try.docopt.org上预览你的逻辑.可选和互斥的参数以非常优雅的方式完成. (4认同)
  • 我迫切希望看到naval_fate.py的其余代码 (4认同)

Ken*_*sen 46

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

main.py:

import sys

first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)
Run Code Online (Sandbox Code Playgroud)

然后跑 python main.py James Smith

产生以下输出:

詹姆斯史密斯你好

  • 我不同意我的用法不太现实.假设您的程序需要知道一个人的确切名字和姓氏,以便在人们可以拥有多个名字和姓氏的商家中运行该脚本?如果詹姆斯史密斯将约瑟夫作为一个额外的名字或姓氏,如果你只做`python main.py"詹姆斯约瑟夫史密斯",怎么能区分约瑟夫是一个额外的名字还是姓?如果您关心索引超出范围,可以添加对提供的参数数量的检查.不太现实,我的例子展示了如何处理多个参数. (10认同)
  • 所有其他答案都用于策划登月任务。我只是简单地使用`gmail-trash-msg.py MessageID`。这个答案是直接测试 `MessageID` 参数已经在 `sys.argv[1]` 中传递的。 (2认同)

whi*_*whi 26

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


Van*_*ale 19

我自己使用optparse,但非常喜欢Simon Willison在他最近推出的optfunc库中采用的方向.它的工作原理是:

"内省函数定义(包括其参数及其默认值)并使用它来构造命令行参数解析器."

所以,例如,这个函数定义:

def geocode(s, api_key='', geocoder='google', list_geocoders=False):
Run Code Online (Sandbox Code Playgroud)

变成了这个optparse帮助文本:

    Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER
Run Code Online (Sandbox Code Playgroud)


小智 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...")
Run Code Online (Sandbox Code Playgroud)

最近我一直在包装类似的东西,以减少冗长(例如;隐含"-h").


tve*_*lke 7

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


Ryn*_*ett 7

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

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


小智 5

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

  • 已经有另一个名为 Commando 的命令行解析模块:https://github.com/lakshmivyas/commando。它使用装饰器包装 argparse。 (2认同)
  • 蟒蛇和轮子的重新发明 (2认同)

cir*_*uin 5

另一种选择是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()
Run Code Online (Sandbox Code Playgroud)

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

  • @tripleee YMMV,但我发现这在文档中比在库本身中更像是一个缺陷。让 `def frobnicate_spleches(...)` 定义一个函数来执行你的脚本所做的任何事情,然后在文件末尾执行 `if __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)` 似乎是完全可行的。 (2认同)

JON*_*JON 5

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
Run Code Online (Sandbox Code Playgroud)