如何在Python中实现命令行函数的选项/参数
我的Python版本是2.4.3。
现在我正在用Python的cmd模块开发一个命令行界面(CLI),这是为了控制一个CD播放器。我有一些类,比如CDContainer(里面有添加CD、移除CD等方法)和CD(里面有播放、停止、暂停等方法)。现在,我想为这些命令添加一些选项,并且如果输入的选项不正确,命令行界面能够返回关于错误输入类型或错误值的正确信息。例如,我想要有“addcd --track 3 --cdname thriller”这样的命令。我现在的做法是获取所有的参数,通过逗号分隔,然后把它们分配给相关的变量,如下所示。
我的问题是,在Python中,有没有什么模块可以方便我解析和分析这些选项或参数?
修订:好的,我编辑了一下,感谢gclj5的评论。
import cmd
class CDContainerCLI(cmd.Cmd):
def do_addcd(self, line):
args=line.split()
parser = OptionParser()
parser.add_option("-t", "--track", dest="track_number", type="int",
help="track number")
parser.add_option("-n", "--cdname", dest="cd_name", type="string",
help="CD name")
(options, positional_args) = parser.parse_args(args)
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
如果可以的话,能不能写一些代码示例,给我展示一下怎么做?
非常感谢!!
3 个回答
这是我几个月前写的一个示例脚本,当时我和我的同事们正在学习argparse模块。这个脚本展示了这个模块的几个功能和特点:
import sys
import argparse
def parse_command_line():
# Define our argument parser.
ap = argparse.ArgumentParser(
description = 'This is a demo app for the argparse module.',
epilog = 'This text will appear after options.',
usage = '%(prog)s [options]', # Auto-generated by default.
add_help = False, # Default is True.
)
# A grouping of options in the help text.
gr = ap.add_argument_group('Required arguments')
# A positional argument. This is indicated by the absense
# of leading minus signs.
gr.add_argument(
'task',
choices = ['get', 'put'],
help = 'Task to be performed.', # Help text about an option.
metavar = 'TASK', # Placeholder to be used in an option's help text.
# The default in this case would be "{get,put}".
)
# Another group.
gr = ap.add_argument_group('Common options')
# A basic option.
gr.add_argument(
'-s', '--subtask',
action = 'store', # This is the default.
# One value will be stored, as a string,
# in opt.subtask
)
# A required option, with type conversion.
gr.add_argument(
'-u', '--user',
required = True, # Options can be made mandatory.
# However, positional arguments can't be made optional.
type = int, # Convert opt.user to an integer.
# By default, it would be a string.
)
# A flag option.
gr.add_argument(
'--overwrite',
dest = 'clobber', # Store in opt.clobber rather than opt.overwrite.
action = 'store_true', # If option is supplied, opt.clobber == True.
)
# Another group.
gr = ap.add_argument_group('Some other options')
# An option with multiple values.
gr.add_argument(
'--datasets',
metavar = 'DATASET', # Default would be DATASETS.
nargs = '+', # If option is used, it takes 1 or more arguments.
# Will be stored as a list in opt.datasets.
help = "The datasets to use for frobnication.",
)
# An option with a specific N of values.
gr.add_argument(
'--bar',
nargs = 1, # Takes exactly one argument. Differs from a basic
# option because opt.bar will be a list rather
# than a string.
default = [], # Default would be None.
)
# A file option.
gr.add_argument(
'--log',
type = argparse.FileType('w'), # Will open a file for writing.
default = sys.stdout,
help = 'Log file (default: STDOUT)',
)
# Another group.
gr = ap.add_argument_group('Program information')
# A version option.
gr.add_argument(
'-v', '--version',
action = 'version', # Will display version text and exit.
version = 'argparse_demo v1.2.0', # The version text.
)
# A help option.
gr.add_argument(
'-h', '--help',
action = 'help', # Will display help text and exit.
)
# Parse the options.
# If given no arguments, parse_args() works with sys.argv[1:].
# And the object it returns will be of type Namespace.
opt = ap.parse_args()
return opt
command_lines = [
'argparse_demo.py put -u 1',
'argparse_demo.py get -u 234 --over --data a b c --bar XYZ -s munch --log _log.txt',
'argparse_demo.py -h', # Will exit() here.
]
for c in command_lines:
sys.argv = c.split()
opt = parse_command_line()
print opt
我想问的是,在Python中,有没有什么模块可以方便地解析和分析选项或参数?
有的,可以使用argparse模块。
如果你对C语言中的getopt库已经熟悉的话,Python中也有这个模块,不过如果你不太熟悉的话,使用起来会比较麻烦。
根据你使用的Python版本,你可以看看optparse(从2.3版本开始,2.7版本后不再推荐使用)或者argparse(从2.7版本开始)。
这里有一些使用optparse的示例代码(line
是你从命令行读取的字符串):
from optparse import OptionParser
args = line.split()
parser = OptionParser()
parser.add_option("-t", "--track", dest="track_number", type="int",
help="track number")
parser.add_option("-n", "--cdname", dest="cd_name", type="string",
help="CD name")
# args[0] contains the actual command ("addcd" in this example).
(options, positional_args) = add_cd_parser.parse_args(args[1:])
if options.track_number != None and options.cd_name != None:
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
print "add CD (track %d, name %s)" % (options.track_number, options.cd_name)
这个解析器只处理你的“addcd”命令。如果你有更多的命令,可以用多个OptionParser
对象放在一个字典里,命令名作为键。这样你就可以像下面这样解析选项:
(options, args) = parsers[args[0]].parse_args(args[1:])
想了解更多信息,可以查看optparse的文档。比如,输出使用信息是非常简单的。此外,还有一个教程可以参考。