706

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

Python 程序员有哪些方法可以做到这一点?

有关的

4

18 回答 18

629
import sys

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

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

基本上,

import sys
print(sys.argv[1:])
于 2009-06-17T22:42:25.593 回答
532

标准库中的规范解决方案是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支持(除其他外):

  • 任何顺序的多个选项。
  • 短期和长期的选择。
  • 默认值。
  • 生成使用帮助消息。
于 2009-06-17T22:39:49.937 回答
131

只是四处宣传argparse出于这些原因更好..本质上:

(从链接复制)

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

  • argparse 对你的命令行界面应该是什么样子不是教条主义的 - 支持 -file 或 /file 之类的选项,以及必需的选项。Optparse 拒绝支持这些功能,更喜欢纯粹而不是实用性

  • argparse 生成更多信息性使用消息,包括根据您的参数确定的命令行用法,以及位置和可选参数的帮助消息。optparse 模块要求您编写自己的用法字符串,并且无法显示位置参数的帮助。

  • argparse 支持使用可变数量的命令行参数的操作,而 optparse 要求提前知道参数的确切数量(例如 1、2 或 3)

  • argparse 支持分派到子命令的解析器,而 optparse 需要 allow_interspersed_args手动设置和执行解析器分派

还有我个人最喜欢的:

  • argparse 允许add_argument() 使用简单的可调用对象指定类型和操作参数,而 optparse 需要破解类属性,例如 STORE_ACTIONSorCHECK_METHODS以获得正确的参数检查
于 2009-06-26T18:15:02.380 回答
72

还有argparsestdlib模块(stdlib模块的“改进” 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
于 2009-06-18T03:12:25.283 回答
63

如果您需要快速且不太灵活的东西

主要.py:

import sys

first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)

然后运行python main.py James Smith

产生以下输出:

你好詹姆斯史密斯

于 2015-10-25T11:40:25.450 回答
51

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

import sys

for arg in sys.argv:
    print arg
于 2009-06-17T22:43:08.573 回答
50

docopt库非常漂亮它从您的应用程序的使用字符串构建一个参数字典。

例如来自 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)
于 2013-02-09T16:52:31.510 回答
26
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
于 2012-05-11T03:53:30.243 回答
20

我自己使用 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
于 2009-06-18T04:07:57.923 回答
9

我喜欢 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”隐含)。

于 2009-06-18T01:30:28.080 回答
8

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

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

于 2014-08-12T19:38:40.957 回答
8

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

于 2011-08-23T12:57:14.650 回答
6
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
于 2017-10-07T03:25:07.257 回答
5

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

于 2011-02-06T19:28:43.630 回答
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()

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

于 2015-11-11T22:10:35.503 回答
4

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

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

于 2013-08-18T06:21:51.340 回答
2

同样使用 python3,您可能会发现使用 Extended Iterable Unpacking 来处理可选的位置参数很方便,而无需额外的依赖:

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)

上面的argvunpack makearg2arg3"optional" - 如果它们没有在 中指定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)
于 2020-12-04T13:20:55.913 回答
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
于 2011-10-24T12:48:37.020 回答