597 python command-line command-line-arguments
我原来是一名C程序员.我已经看过许多技巧和"黑客"来阅读许多不同的论点.
Python程序员可以通过哪些方式实现这一目标?
Joh*_*ick 526
import sys
print("\n".join(sys.argv))
Run Code Online (Sandbox Code Playgroud)
sys.argv 是一个列表,其中包含在命令行上传递给脚本的所有参数.
基本上,
import sys
print(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)
Aym*_*ieh 433
标准库中的规范解决方案是argparse(docs):
这是一个例子:
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()
Run Code Online (Sandbox Code Playgroud)
argparse 支持(除其他外):
Sil*_*eed 126
只是为argparse传福音,这对于这些原因更好..本质上:
(从链接复制)
argparse模块可以处理位置和可选参数,而optparse只能处理可选参数
argparse对于你的命令行界面应该是什么样子并不是教条主义 - 支持像-file或/ file这样的选项,以及必需的选项.Optparse拒绝支持这些功能,更喜欢纯度而非实用性
argparse生成更多信息性使用消息,包括根据参数确定的命令行用法,以及有关位置参数和可选参数的帮助消息.optparse模块要求您编写自己的用法字符串,并且无法显示位置参数的帮助.
argparse支持使用可变数量的命令行参数的操作,而optparse需要事先知道确切的参数数量(例如1,2或3)
argparse支持调度到子命令allow_interspersed_args的解析器,而optparse需要手动设置
和执行解析器调度
而我个人的最爱:
add_argument()
使用简单的callables指定类型和操作参数,而optparse需要黑客类属性,如
STORE_ACTIONS或CHECK_METHODS获得正确的参数检查jfs*_*jfs 67
还有argparsestdlib模块(stdlib模块上的"impovement" 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))
Run Code Online (Sandbox Code Playgroud)
用法:
$ script.py 1 2 3 4
4
$ script.py --sum 1 2 3 4
10
Run Code Online (Sandbox Code Playgroud)
JPC*_*sta 49
一种方法是使用sys.argv.这将打印脚本名称作为第一个参数以及传递给它的所有其他参数.
import sys
for arg in sys.argv:
print arg
Run Code Online (Sandbox Code Playgroud)
ral*_*oss 49
该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)
Run Code Online (Sandbox Code Playgroud)
Ken*_*sen 46
如果你需要快速而不灵活的东西
main.py:
import sys
first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)
Run Code Online (Sandbox Code Playgroud)
然后跑 python main.py James Smith
产生以下输出:
詹姆斯史密斯你好
whi*_*whi 26
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
Run Code Online (Sandbox Code Playgroud)
Van*_*ale 19
我自己使用optparse,但非常喜欢Simon Willison在他最近推出的optfunc库中采用的方向.它的工作原理是:
"内省函数定义(包括其参数及其默认值)并使用它来构造命令行参数解析器."
所以,例如,这个函数定义:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
Run Code Online (Sandbox Code Playgroud)
变成了这个optparse帮助文本:
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
Run Code Online (Sandbox Code Playgroud)
小智 8
我喜欢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...")
Run Code Online (Sandbox Code Playgroud)
最近我一直在包装类似的东西,以减少冗长(例如;隐含"-h").
另一种选择是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()
Run Code Online (Sandbox Code Playgroud)
它会自动生成帮助等等,你可以使用装饰器来提供关于 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
621540 次 |
| 最近记录: |