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

zrfyljdw  于 2021-08-20  发布在  Java
关注(0)|答案(18)|浏览(596)

我原来是一名c程序员。我见过许多技巧和“黑客”来阅读许多不同的论点。
python程序员可以通过哪些方式实现这一点?

相关的

获取/解析传递给python脚本的命令行参数的最佳方法是什么?
实现“[command][action][parameter]”风格的命令行界面?
如何在python中处理命令行参数?
如何使用python的optpass设置位置参数帮助的格式?

ajsxfq5m

ajsxfq5m1#

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

最近我一直在 Package 类似的东西,以使事情不那么冗长(例如;使“-h”隐式)。

mo49yndu

mo49yndu2#

我的解决方案是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
wbrvyc0a

wbrvyc0a3#

此外,在python3中,您可能会发现使用扩展iterable解包处理可选位置参数很方便,而无需附加依赖项:

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 ,则为无,如果未指定第一个,则valueerror为thouwn:

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)
ckocjqey

ckocjqey4#

我建议将docopt作为这些其他产品的简单替代品。
docopt是一个新项目,其工作原理是解析--help用法消息,而不是要求您自己实现所有内容。你只需要把你的使用信息放在posix中。

bmvo0sr5

bmvo0sr55#

另一个选择是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()

它将自动生成帮助等等,您可以使用decorator提供关于arg解析应该如何工作的额外指导。

d7v8vwbk

d7v8vwbk6#

您可能会对我编写的一个小python模块感兴趣,该模块使命令行参数的处理变得更加容易(开源和免费使用)——commando

eqfvzcg8

eqfvzcg87#

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
u7up0aaq

u7up0aaq8#

pocoo的点击更加直观,所需的样板文件更少,并且至少与argparse一样强大。
到目前为止,我遇到的唯一缺点是,您无法对帮助页面进行太多定制,但这通常不是一个要求,而docopt似乎是一个明确的选择。

xsuvu9jc

xsuvu9jc9#

正如您所看到的“optparse”,optparse模块已被弃用,不会进一步开发;argparse模块将继续开发。”

djp7away

djp7away10#

标准库中的标准解决方案是 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` 支持(除其他外):
任意顺序的多个选项。
短期和长期选择。
默认值。
生成用法帮助消息。
7y4bm7vi

7y4bm7vi11#

我自己也使用optparse,但非常喜欢simon willison最近推出的optfunc库所采用的方向。其工作原理如下:
“内省函数定义(包括其参数及其默认值),并使用该定义构造命令行参数解析器。”
例如,此函数定义:

def geocode(s, api_key='', geocoder='google', list_geocoders=False):

已转换为此OptPass帮助文本:

Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER
fbcarpbf

fbcarpbf12#


# set default args as -h , if no args:

if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
ibrsph3r

ibrsph3r13#

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)
vtwuwzda

vtwuwzda14#

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

import sys

for arg in sys.argv:
    print arg
zour9fqk

zour9fqk15#

如果你需要一些快速且不太灵活的东西
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 要生成以下输出:
你好,詹姆斯·史密斯

相关问题