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

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

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

相关的

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

djp7away

djp7away1#

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

q9rjltbz2#

import sys

print("\n".join(sys.argv))
``` `sys.argv` 包含在命令行上传递给脚本的所有参数的列表。 `sys.argv[0]` 是脚本名。
基本上,

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

mutmk8jj

mutmk8jj3#

仅仅是为了这些原因而四处传福音,哪一个更好。。基本上:
(从链接复制)
argparse模块可以处理位置参数和可选参数,而optparse只能处理可选参数
argparse对于命令行界面应该是什么样子并不是教条式的-支持-file或/file等选项,以及必需的选项。optparse拒绝支持这些功能,更倾向于纯粹性而非实用性
argparse生成更多信息性的用法消息,包括根据参数确定的命令行用法,以及位置参数和可选参数的帮助消息。optparse模块要求您编写自己的使用字符串,并且无法显示位置参数的帮助。
argparse支持使用数量可变的命令行arg的操作,而optparse要求提前知道参数的确切数量(例如1、2或3)
argparse支持分派到子命令的解析器,而optparse需要设置 allow_interspersed_args 以及手动执行解析器分派
我个人最喜欢的是:
argparse允许类型和操作参数 add_argument() 要使用简单的可调用项指定,而optpass需要黑客类属性,如 STORE_ACTIONSCHECK_METHODS 要获得正确的参数检查

cigdeys3

cigdeys34#

还有 argparse stdlib模块(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
zour9fqk

zour9fqk5#

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

vtwuwzda

vtwuwzda6#

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

import sys

for arg in sys.argv:
    print arg
ibrsph3r

ibrsph3r7#

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

fbcarpbf8#


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

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

7y4bm7vi9#

我自己也使用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
ajsxfq5m

ajsxfq5m10#

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

xsuvu9jc

xsuvu9jc11#

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

u7up0aaq

u7up0aaq12#

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

eqfvzcg8

eqfvzcg813#

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
d7v8vwbk

d7v8vwbk14#

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

bmvo0sr5

bmvo0sr515#

另一个选择是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解析应该如何工作的额外指导。

相关问题