Python从命令行解析参数

时间:2012-03-29 10:03:38

标签: python

我有一个关于在Python中传递参数的问题。对于Ex:在脚本中我期待像

这样的参数
1.python run.py -create vairbale1 -reference variable2 many more variables
2.python run.py  -get -list variable many more variable

如何使用optparse或getopt在脚本中进行此操作,如果参数无效,我需要打印无效参数

 from optparse import OptionParser

 parser = OptionParser()

2 个答案:

答案 0 :(得分:3)

这是我用过的一个片段。我为我工作过,但你可能不得不改变参数类型。

parser = OptionParser()
parser.add_option('-n', '--db_name', help='DB Name (comma separated if multiple DBs - no spaces)')
parser.add_option('-H', '--db_host', help='DB host (comma separated if multiple DBs - no spaces)')
parser.add_option('-p', '--db_port', help='DB port (optional)')
parser.add_option('-u', '--db_user', help='DB user')
parser.add_option('-w', '--db_pass', help='DB password')
parser.add_option('-o', '--output-file', help='output file')

options, args = parser.parse_args()

errors = []
error_msg = 'No %s specified. Use option %s'
if not options.db_name:
    errors.append(error_msg % ('database name', '-n'))
if not options.db_host:
    errors.append(error_msg % ('database host', '-H'))
if not options.db_user:
    errors.append(error_msg % ('database user', '-u'))
if not options.db_pass:
    errors.append(error_msg % ('database password', '-w'))
if not options.output_file:
    errors.append(error_msg % ('output file', '-o'))

if errors:
    print '\n'.join(errors)
    sys.exit(1)

答案 1 :(得分:2)

您可以使用自定义操作验证您的数据,例如

import argparse
import re

class ValidateEmailAction(argparse.Action):
    ''' 
    Function will not validate domain names.
    e.g. abcd@abcd.abcd is valid here.
    '''
    def __call__(self, parser, namespace, values, option_string=None):

        super(argparse.Action, self).__call__(parser, namespace, values,
                                                  option_string=option_string)
        email = values
        pattern = "^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$"
        if not re.match(pattern, email) != None:
            raise AttributeError


parser = argparse.ArgumentParser()
parser.add_argument('-e', '--email', action=ValidateEmailAction, help='Enter valid email.')

同时检查http://docs.python.org/dev/library/argparse.html#action

上的自定义操作