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

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

有关的

有帮助吗?

解决方案

标准库中的规范解决方案是 argparse (文档):

这是一个例子:

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

  • 任意顺序的多个选项。
  • 短和长的选择。
  • 默认值。
  • 生成使用帮助消息。

其他提示

import sys

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

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

基本上,

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

只是四处传福音 arg解析 哪个更适合 这些 原因..本质上:

(从链接复制)

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

  • argparse 并不拘泥于 命令行界面 选项,如 -file 支持 所需选项。Optparse 拒绝 支持这些功能,更倾向于 纯洁性高于实用性

  • argparse 生成更多 翔实的使用信息,包括 所确定的命令行使用情况 您的参数和帮助信息 既可定位又可选择 争论。optparse 模块 要求您编写自己的用法 字符串,并且无法显示 位置参数的帮助。

  • argparse 支持 消耗数量不等的 命令行参数,而 optparse 要求 参数(例如1、2 或 3)已知 事先

  • ArgParse支持派出子命令的解析器,而OptParse需要设置allow_interspersed_args 并做到 解析器手动调度

我个人最喜欢的是:

  • argparse 允许使用类型和 动作参数 add_argument() 将用简单的 而 optparse 需要 黑客类属性,如 STORE_ACTIONS 或者 CHECK_METHODS 以获得 正确的参数检查

还有 argparse 标准库模块 (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

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

import sys

for arg in sys.argv:
    print arg

文档 图书馆真的很光滑。它根据应用程序的使用字符串构建一个参数字典。

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

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

主要.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 最近推出的方向 可选函数 图书馆。它的工作原理是:

"反省函数 定义(包括其参数 及其默认值),并使用 以构建命令行 参数解析器"。

例如,这个函数定义:

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 模块已被弃用,并且不会进一步开发;发展将继续与 arg解析 模块。”

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

到目前为止,我遇到的唯一弱点是您无法对帮助页面进行太多自定义,但这通常不是必需的,并且 文档 看起来这是一个明确的选择。

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

我建议看看 文档 作为其他这些的简单替代品。

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

还有一个选择是 啊啊. 。它建立在 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 解析如何工作的额外指导。

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

我的解决方案是 入口点2. 。例子:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top