如何读取/处理命令行参数?
-
06-07-2019 - |
题
我原本是一名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”隐式)。
您可能对我编写的一个小 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