python脚本入参

有时候需要在执行python脚本的时候接收入参,所以特地总结了2中方法,有理论有实例

方法

1 arvg参数获取

import sys  

print sys.argv[0] ##脚本名  
print sys.argv[1] ## 第一个参数,后面以此类推

print len(sys.argv)  ##参数个数  

2 getopt模块获取

getopt模块是专门用来处理命令行参数的,里面的提供了2个函数和一个类,我们主要使用getopt函数,原型为:

def getopt(args, shortopts, longopts = []): 

调用语句为:

opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="]) 

参数解释

有两种格式的参数,一种为短参数,如"-h";另外一种是长参数,如"--version"
而且,参数后面又要区分,是否带了入参值,如查看help命令,只需要"-h",就是不需要带入参值得;如果是输入ip,如"-i 127.0.0.1",这个就是带了入参值得

短参数中,需要输入的如入参名后面加了冒号":",表明需要带参数,不加冒号则表明不要,
如上面的例子,短参数为"ho:",表明有两个短参数,"-h","-o",其中"-o"需要后面接参数

长参数中,后面如果接了等号"=",表明需要带参数,不加则表明不要
如上面的例子,长参数为["help", "output="],表明有两个长参数,一个"--help",不需要后面带参数;一个"--output",需要后面带参数

返回值

调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数(即那些不含"-/--"的参数)。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。

如果附加参数为'-h -o file --help --output=out file1 file2'
在分析完成后,opts 应该是: [('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]
而args 则为: ['file1', 'file2']

实例

封装一个MySQL的SQL语句封装层,可以自动从配置文件里面读取数据库(主-主复制集群)IP

db.ini文件

[DB_IP]
db1=172.16.101.202
db2=172.16.101.203

[USER]
user=admin

[PASSWORD]
password=cgsl123

[DB]
database=test
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
import getopt
import MySQLdb
import ConfigParser

class mysql_opt():

    def __init__(self):
        config        = ConfigParser.ConfigParser()
        config.read("db.ini")

        db1_ip = config.get("DB_IP","db1")
        db2_ip = config.get("DB_IP","db2")
        user   = config.get("USER","user")
        pwd    = config.get("PASSWORD","password")
        db_name= config.get("DB", "database")
        try:
            self.db = MySQLdb.connect(db1_ip, user, pwd, db_name)
        except:
            self.db = MySQLdb.connect(db2_ip, user, pwd, db_name)
        #self.db = MySQLdb.connect("172.16.101.203","admin","cgsl123","test" )
        self.cursor = self.db.cursor()

    def __del__(self):
        self.db.close()

    def exec_sql(self,sql):
       
        print sql
        try:
            #cursor = self.db.cursor()
            # 执行sql语句
            self.cursor.execute(sql)
            # 提交到数据库执行
            self.db.commit()
        except Exception,e:
            # Rollback in case there is any error
            print "exec sql error"
            print Exception,":",e

            self.db.rollback()

    def create(self,table,args):

        sql = "create table " + table + "( " + args[0]+ " " + args[1] + " unique key" +","

        for para in args[2:-1]:
            if para in ["char","varchar"]:
                sql = sql + para + "(20)" + ","
            elif para in ["int","double","datetime"]:
                sql = sql + para + ","
            else:
                sql = sql + para + " "

        if args[-1] in ["char", "varchar"]:
            self.exec_sql(sql + args[-1]+ "(20)" +")")
        else:
            self.exec_sql(sql + args[-1] + ")")

    def drop(self,table):

        sql = "drop table " + table

        self.exec_sql(sql)

    def select(self,table):

        sql = "select * from " + table

        self.exec_sql(sql)

    def insert(self,table,args):

        sql = "insert into " + table + "("

        col = []
        value = []
        #print args
        for index in range(len(args)):
            if (index % 2) == 0:
                col.append(args[index])
            else:
                value.append(args[index])
        print col
        print value
        for c in range(len(col)):
            if c < len(col)-1:
                sql = sql + col[c] + ","
            else:
                sql = sql + col[c]

        sql = sql + ") values ("

        for v in range(len(value)):
            if v < len(value)-1:
                if col[v] in ["char","varchar"]:
                    sql = sql + '"' + value[v] + '"'  + ','
                else:
                    sql = sql + value[v] + ","
            else:
                if col[v] in ["char","varchar"]:
                    sql = sql + '"' + value[v] + '"' 
                else:
                    sql = sql + value[v]

        self.exec_sql(sql + ")")

    def update(self,table,args):

        sql = "update " + table + " set " + args[0] + "=" + args[1] + " where " + args[2] + "=" + args[3]

        self.exec_sql(sql)


def help():
    print " ****** command format ****** "
    print " [create table] ./test.py -c/--create table_name col1 type1 col2 type2...(first col is key)"
    print " [drop table]   ./test.py -d/--drop table_name "
    print " [select table] ./test.py -s/--select table_name "
    print " [insert table] ./test.py -s/--insert table_name col1 value1 col2 value2...(if value is string,use \"string\"),-i table id 4 name \"chen\"  "
    print " [update table] ./test.py -s/--update table_name col new_value row row_value (if value is string,use \"string\"),-u table name \"chen\" id 2 "


def main(argv):

    try:
        opts, args = getopt.getopt(argv, "hc:d:s:i:u:", ["help", "create=","drop=","select=","insert=","update=",])
    except:
        print "getopt error!"
        sys.exit(2)

    if len(opts)==0:
        help()

    db_conn = mysql_opt()

    for opt,arg in opts:
        if opt in ["-h","--help"]:
            help()
        elif opt in ["-c","--create"]:
            db_conn.create(arg,args)
        elif opt in ["-d","--drop"]:
            db_conn.drop(arg)
        elif opt in ["-s","--select"]:
            db_conn.select(arg)
        elif opt in ["-i", "--insert"]:
            db_conn.insert(arg,args)
        elif opt in ["-u", "--update"]:
            db_conn.update(arg,args)


if __name__ == '__main__':
    main(sys.argv[1:])


argparse模块介绍

argparse是python标准库中的模块,可以完成对命令行的参数定义、解析以及后续的处理.

http://www.cnblogs.com/xiaofeiIDO/p/6154953.html

主要有三个步骤:

1、创建 ArgumentParser() 对象

parser = argparse.ArgumentParser(description="some information here")

ArgumentParser函数有很多可选参数,prog、usage、description、epilog分别定义解析器的名称、使用说明、描述、最后的结尾描述

2、调用 add_argument() 方法添加参数

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。

  • action - 命令行遇到参数时的动作,

a) 默认值是 store,只是保存参数的值
b) store_const,表示赋值为const;

>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args('--foo'.split())
Namespace(foo=42)

c) append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;

>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])

d) append_const,保存一个列表,并将const关键字参数指出的值附加在列表的后面。(注意const关键字参数默认是None。)'append_const' 动作在多个参数需要保存常量到相同的列表时特别有用

>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[, ])

e) count,计算关键字参数出现的次数;例如,这可用于增加详细的级别

>>> parser.add_argument('--verbose', '-v', action='count')
>>> parser.parse_args('-vvv'.split())
Namespace(verbose=3)
  • nargs - 将一个动作与不同数目的命令行参数关联在一起,可以是具体的数字,或者是?号,当不指定值时对于 - Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])

如果没有提供nargs关键字参数,读取的参数个数取决于action。通常这意味着将读取一个命令行参数并产生一个元素(不是一个列表)。

  • const - action 和 nargs 所需要的常量值。

  • default - 不指定参数时的默认值。

  • type - 默认情况下,ArgumentParser对象以简单字符串方式读入命令行参数。然而,很多时候命令行字符串应该被解释成另外一种类型,例如浮点数或者整数。add_argument()的type关键字参数允许任意必要的类型检查并作类型转换

  • choices - 某些命令行参数应该从一个受限的集合中选择。这种情况的处理可以通过传递一个容器对象作为choices关键字参数给add_argument()。当解析命令行时,将检查参数的值,如果参数不是一个可接受的值则显示一个错误信息。

  • required - argparse模块假定-f和--bar标记表示可选参数,它们在命令行中可以省略。如果要使得选项是必需的,可以指定True作为required=关键字参数的值给add_argument(): (仅针对可选参数)。

  • help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.

  • metavar - 当ArgumentParser生成帮助信息时,它需要以某种方式引用每一个参数。 默认情况下,ArgumentParser对象使用dest的值作为每个对象的“名字”。默认情况下,对于位置参数直接使用dest的值,对于可选参数则将dest的值变为大写。所以,位置参数dest='bar'将引用成bar。后面带有一个命令行参数的可选参数--foo将引用成FOO。

  • dest - 大部分ArgumentParser动作给parse_args()返回对象的某个属性添加某些值。该属性的名字由add_argument()的dest关键字参数决定。对于位置参数的动作,dest 通常作为第一个参数提供给add_argument():

恩,上面大串参数如果看着头晕,可以不看,下面解释和举例出常用的
在python脚本后面的参数,可以分为两类

  • 定位参数:
    即不需要带"-/--"之类就可以使用的,
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print args.square**2
$ python argparse_usage.py 9    #不需要带什么 -x 之类的
81
  • 可选参数
    即需要
parser = argparse.ArgumentParser()

parser.add_argument("-s","--square", help="display a square of a given number", type=int)
parser.add_argument("-c","--cubic", help="display a cubic of a given number", type=int)

args = parser.parse_args()

if args.square:
    print args.square**2

if args.cubic:
    print args.cubic**3
$ python argparse_usage.py --square 8
64

$ python argparse_usage.py --cubic 8
512
  • 两种参数混合
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)
$ python prog.py 1 2 3 4
4

$ python prog.py 1 2 3 4 --sum
10

调用parse_args()返回的对象将带有两个属性,integers和accumulate。属性integers将是一个包含一个或多个整数的列表,如果命令行上指定 --sum,那么属性accumulate将是sum()函数,如果没有指定,则是max()函数

  • 子命令
    将多个命令组合进一个程序中,使用子解析器来处理命令行的每个部分。就像svn,以及OpenStack各个组件那样。
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, help][, metavar])
parser = argparse.ArgumentParser()
 
subparsers = parser.add_subparsers(help='commands')
 
create_parser = subparsers.add_parser('create',help='Create a directory')

create_parser.add_argument('dirname',action='store',help='New directoryto create')

create_parser.add_argument('--read-only',default=False, action='store_true',
    help='Setpermissions to prevent writing to the directory',
    )

3、使用 parse_args() 解析添加的参数

使用函数parse_args()进行参数解析,这个函数的输入默认是sys.argv[1:],也可以使用其他字符串列表,parse_args的返回值是一个包含命令参数的Namespace。所有参数以属性的形式存在,比如args.myoption

附:通用模板

import sys
 
def version_info():
    VERSION_INFO = 'PROG v1'
    AUTHOR_INFO = 'Author: crazyof.me'
    print VERSION_INFO
    print AUTHOR_INFO
 
def scan(host, ports, threads, useragent):
    print host
    print ports
    print threads
    print useragent
 
if __name__ == '__main__':
    parse = argparse.ArgumentParser()
    parse.add_argument('-v', '--version', action='store_true', default=False, help='Version information')
    parse.add_argument('-s', '--scan', action='store_true', default=False, help='Run masscan.')
    # parse.add_argument('-H', '--host', required=True, type=str, help='Scan this host or list of hosts')
    parse.add_argument('-H', '--host', type=str, help='Scan this host or list of hosts')
    parse.add_argument('-P', '--ports', type=str, default='21,22,80,443,8000,8080,8443,2080,2443,9090,6000,8888,50080,50443,5900', help='Specify ports in masscan format. (ie.0-1000 or 80,443...)')
    parse.add_argument('-t', '--threads', type=int, default=1, help='Specify the number of threads to use.')
    parse.add_argument('-a', '--ua', type=str, default='o_O O_o', help='Specify a User Agent for requests')
    args = parse.parse_args()
 
    if len(sys.argv) <= 1:
        parse.print_help()
        sys.exit(0)
 
    if args.version:  #因为「action='store_true'」,所以「args.version的值为True/False」
        version_info()
        sys.exit(0)
 
    if args.scan and (args.host is not None):  #因为为args.host设置了「type=str」,所以「args.host的值为None/设定的字符串的值」
        scan(args.host, args.ports, args.threads, args.ua)

你可能感兴趣的:(python脚本入参)