Python 如何读取/处理命令行参数?
我原来是一名C程序员。我见过许多技巧和“黑客”来阅读许多不同的论点 Python程序员可以通过哪些方式实现这一点 相关的Python 如何读取/处理命令行参数?,python,command-line,command-line-arguments,Python,Command Line,Command Line Arguments,我原来是一名C程序员。我见过许多技巧和“黑客”来阅读许多不同的论点 Python程序员可以通过哪些方式实现这一点 相关的 标准库中的标准解决方案是argparse(): 以下是一个例子: from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-f", "--file", dest="filename", help="write rep
- 标准库中的标准解决方案是
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
支持(除其他外):
- 任意顺序的多个选项
- 短期和长期选择
- 默认值
- 生成用法帮助消息
sys.argv[0]
是脚本名称
基本上
import sys
print(sys.argv[1:])
一种方法是使用
sys.argv
。这将打印脚本名称作为第一个参数以及传递给它的所有其他参数
import sys
for arg in sys.argv:
print arg
我喜欢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”隐式)。还有(stdlib的optpasse
模块上的“改进”)。示例来自:
用法:
$ script.py 1 2 3 4
4
$ script.py --sum 1 2 3 4
10
我自己也使用optparse,但真的很喜欢Simon Willison最近引入的库的方向。其工作原理如下: “反思一个函数 定义(包括其参数) 以及它们的默认值)并使用 该命令用于构造命令行 参数分析器。” 例如,此函数定义:
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
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
只是到处传福音,有什么更好的理由。。基本上: (从链接复制)
- argparse模块可以处理位置信息 和可选参数,而 optpass只能处理可选的 论据
- argparse并不是教条式的 您的命令行界面是什么 应该看起来像-选项像-文件 支持或/文件,如下所示 所需选项。Optparse拒绝 支持这些功能,首选 纯粹胜于实用
- argparse产生更多 信息性使用信息,包括 命令行使用情况由 您的参数,以及的帮助消息 位置和可选的 论据。optparse模块 要求您编写自己的用法 字符串,并且无法显示 位置参数的帮助
- argparse支持以下操作: 消耗不同数量的 命令行参数,而optpass 要求 参数(如1、2或3)是已知的 提前
- argparse支持
调度到子命令,而
OptPass需要设置
并执行 解析器手动分派允许插入参数
- argparse允许类型和
将操作参数添加到
用简单的 可调用,而optpasse需要 黑客类属性,如添加参数()
或存储操作
以获取 正确的参数检查检查方法
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
帮助文本:
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
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
这个图书馆真的很漂亮。它根据应用程序的用法字符串构建参数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)
海军的命运。
用法:
海军命运号新。。。
海军舰艇移动[--速度=]
海军舰艇射击
海军水雷(设置|移除)[--系泊|--漂移]
海军命运号(-h |——帮助)
navalu_fate.py--版本
选项:
-h--帮助显示此屏幕。
--版本显示版本。
--速度=以节为单位的速度[默认值:10]。
--停泊(锚定)的矿井。
--漂流矿。
"""
从docopt导入docopt
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
arguments=docopt(\uuuu doc\uuuu,version='2.0')
打印(参数)
我建议将其视为其他方法的简单替代方法
docopt是一个新项目,其工作原理是解析--help用法消息,而不是要求您自己实现所有内容。您只需将您的使用信息转换为POSIX格式。Pocoo更直观,所需的样板文件更少,并且至少与argparse一样强大
到目前为止,我遇到的唯一缺点是,您无法对帮助页面进行太多定制,但这通常不是一个要求,而且如果需要快速且不太灵活的页面,这似乎是一个明确的选择。 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
要生成以下输出:
你好,詹姆斯·史密斯
另一个选择是。它以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解析工作方式的额外指导。同样,对于python3,您可能会发现使用扩展的Iterable解包处理可选的位置参数很方便,而无需附加依赖项:
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
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
unpack使arg2
和arg3
成为“可选”-如果在argv
中未指定它们,则它们将为无,而如果未指定第一个,则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)
回溯(最近一次呼叫最后一次):
文件“test.py”,第3行,在
_,arg1,arg2,arg3,*.=sys.argv+[None]*2
ValueError:没有足够的值来解包(至少需要4个,得到3个)
是的,这些是最好的。因为它们是标准库的一部分,所以您可以确保它们可用且易于使用。尤其是optparse功能强大且简单。optparse是最好的之一;getopt很旧,确实应该被视为不推荐使用
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)