2012-03-29 67 views
2

我有一个关于在Python.for防爆传递参数的一个问题:在脚本中,我使用optparse或getopt的预期参数,像Python的解析来自命令行参数

1.python run.py -create vairbale1 -reference variable2 many more variables 
2.python run.py -get -list variable many more variable 

我怎么可以在脚本enfore表示这一点,如果参数无效我需要打印无效参数

from optparse import OptionParser 

parser = OptionParser() 
+3

FYI自定义操作:'optparse'模块现在已经贬值。从2.7开始,你可能会想要使用'argparse'模块:http://docs.python.org/library/argparse.html#module-argparse – 2012-03-29 10:12:47

回答

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) 
+0

Canu请为任何一个例子解释你如何使用它 – Rajeev 2012-03-29 10:23:34

+0

您运行脚本python blah.py -n dbname -H dbhost -p 8080 -u dbuser -w dbpass -o path_to_file然后在代码中可以访问使用options.db_name传递的值,例如 – Nostradamnit 2012-03-29 10:32:28

+0

K.Along用-n dbname如果我必须传递一个参数。我如何在代码中更改它? parser.add_option(' - n','--db_name','var1',help ='数据库名称(如果多个数据库以逗号分隔......) – Rajeev 2012-03-29 10:39:35

2

您可以使用自定义操作来验证像

import argparse 
import re 

class ValidateEmailAction(argparse.Action): 
    ''' 
    Function will not validate domain names. 
    e.g. [email protected] 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

+0

k谢谢你的例子..嗯.. – Rajeev 2012-03-29 11:06:20

+1

即使我输入正确的电子邮件地址,你的代码也会出错: 'super(argparse .Action,self).__ call __(parser,namespace,values, AttributeError:'super'对象没有属性'__call __'' – 2014-01-26 04:00:53

+0

这可能是一个新的改变,我会在检查'argparse.Action' – Nilesh 2014-01-27 15:02:34