获取命令行参数

获取命令行参数的三种方法

  1. 使用sys.argv获取
  2. 使用argparse.ArgumentParser类获取
  3. 使用第三方库click获取

sys.argv获取

sys.argv是一个列表,第一个元素是脚本名。

案例

#代码如下
import sys
print(type(sys.argv))
print(sys.argv)
'''
out:
$python test_argv.py 
<class 'list'>
['test_argv.py']
'''

案例

#判断文件是否有访问权限
import os
import sys

def main():
    #给argv列表追加一个空值,防止不写文件名报错
    sys.argv.append('')
    #取命令行第一个参数,也就是文件名
    filename = sys.argv[1]
    if not os.path.isfile(filename):
        raise SystemExit(filename+' does not exists')
    elif not os.access(filename, os.R_OK):
        raise SystemExit(filename + 'is not accessible')
    else:
        print(filename + ' is accessible')

if __name__ == '__main__':
    main()

ArgumentParser获取

使用argparse模块的ArgumentParser类实现。

语法格式

import argparse
parser = argparse.ArgumentParser(description='This is description')

parser.add_argument(name [,action][,nargs][,const][,default][,type][,choices][,required][,help][,metavar][,dest])

parser.parse_args() #解析命令行参数
'''
name: 参数名
action: 遇到参数执行操作,默认值为store
nargs: 参数个数,+表示1或多个,*表示0或多个
const/action/nargs: 需要的常量值
default: 不指定参数时的默认值
type: 参数的类型
choices: 参数允许的值
required: 可选参数是否可以省略,默认为False可省略
help: 参数的帮助信息
metavar: 在usage说明中的参数名称
dest: 解析后的参数名称
'''

案例

import argparse
def _argparse():
    parser = argparse.ArgumentParser(description='This is description')
    #定义--host参数,接受参数后解析后的名称为server,默认值为localhost,帮助信息等
    parser.add_argument('--host',action='store',dest='server',default='localhost',
                        help='connect to host')
    #定义-t参数,同上
    parser.add_argument('-t',action='store_true',default=False,
                        dest='boolean_switch',help='Set a switch to true')
    return parser.parse_args()

def main():
    parser = _argparse()
    #返回结果类型为<class 'argparse.Namespace'>
    print(parser)
    #通过解析后的名称获取参数
    print('host = ',parser.server)
    print('boolean_switch = ',parser.boolean_switch)

if __name__ == '__main__':
    main()
'''
out:
$ python test_argparse.py
Namespace(boolean_switch=False, server='localhost')
host =  localhost
boolean_switch =  False

$ python test_argparse.py --host=127.0.0.1 -t
Namespace(boolean_switch=True, server='=127.0.0.1')
('host = ', '=127.0.0.1')
('boolean_switch = ', True)
'''

--help 自动生成帮助信息

$ python test_argparse.py --help
usage: test.py [-h] [--host SERVER] [-t]

This is description

optional arguments:
  -h, --help     show this help message and exit
  --host SERVER  connect to host
  -t             Set a switch to true

案例2
模仿MySQL客户端命令行参数

import argparse

def _argparse():
    parser = argparse.ArgumentParser(description='A Python-MySQL client')

    parser.add_argument('--host', action='store', dest='host', required=True, 
                        help='connect to host')

    # 使用-u简写参数,参数不可省略
    parser.add_argument('-u', '--user', action='store', dest='user', required=True,
                        help='connect to host')

    parser.add_argument('-p', '--password', action='store', dest='password', required=True,
                        help='password to use when connecting to server')

    parser.add_argument('-P', '--port', action='store', dest='port', default=3306, type=int,
                        help='port number to use for connection or 3306 for default')

    parser.add_argument('-v', '--version', action='version', version='%(prog)s 0.1')
    return parser.parse_args()


def main():
    parser = _argparse()
    #结果转换为字典
    conn_args = dict(host=parser.host, user=parser.user, password=parser.password,
                        port=parser.port)
    print(conn_args)


if __name__ == '__main__':
    main()

'''
out:
$ python argparse_test.py --help
usage: test.py [-h] --host HOST -u USER -p PASSWORD [-P PORT] [-v]

A Python-MySQL client

optional arguments:
  -h, --help            show this help message and exit
  --host HOST           connect to host
  -u USER, --user USER  connect to host
  -p PASSWORD, --password PASSWORD
                        password to use when connecting to server
  -P PORT, --port PORT  port number to use for connection or 3306 for default
  -v, --version         show program's version number and exit

$ python argparse_test.py 
usage: test.py [-h] --host HOST -u USER -p PASSWORD [-P PORT] [-v]
test.py: error: argument --host is required

$ python argparse_test.py --host=127.0.0.1 -u=root -p=123456
{'host': '127.0.0.1', 'password': '123456', 'port': 3306, 'user': 'root'}
'''

第三方库click获取

click是一个第三方库,使用前先安装。
参考资料:官方文档

pip install click

案例

# coding:utf-8
import click
#装饰一个函数使其称为命令行接口
@click.command()
# 问候语的次数,默认为1
@click.option('--count',default=1,help='Number of greetings.')
#如果不带选项--name,则提示prompt中的内容
@click.option('--name',prompt='Your name',help='The person to greet.')

def hello(count,name):
    '''Simple program that greets NAME for a total of COUNT times.'''
    for i in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
'''
out:
$ python test.py --count=3
Your name: tz
Hello tz!
Hello tz!
Hello tz!

$ python test.py --help
Usage: test.py [OPTIONS]

  Simple program that greets NAME for a total of COUNT times.

Options:
  --count INTEGER  Number of greetings.
  --name TEXT      The person to greet.
  --help           Show this message and exit.
'''

option常用设置参数

default: 参数默认值
help: 参数说明
type: 参数类型
prompt: 没有输入参数时所提示的内容
nargs: 指定命令行参数接受的值的个数

案例

#使用nargs配置参数个数,传递的两个参数会以元组的形式传递给pos变量
# coding:utf-8
import click

@click.command()
@click.option('--pos', nargs=2, type=float)
def findme(pos):
    click.echo(type(pos))
    click.echo('%s / %s' % pos)

if __name__ == '__main__':
    findme()

'''
out:
$ python test.py --pos 1  2
<type 'tuple'>
1.0 / 2.0
'''

命令行参数只能取几个固定值之一,可以使用Click中的Choice,Choice是一个列表,该列表可以列出所有可能的值。

# coding:utf-8
import click

@click.command()
@click.option('--hash-type',type=click.Choice(['md5','sha1']))

def digest(hash_type):
    click.echo(hash_type)

if __name__ == '__main__':
    digest()

'''
out:
$ python test.py --hash-type md5
md5
$ python test.py --hash-type sha1
sha1
'''

交互式隐藏式输入密码

交互式输入密码:prompt设置为True
隐藏命令行输入:hide_input设置为True
对密码进行验证:confirmation_prompt设置为True

# coding:utf-8
import click

@click.command()
@click.option('--password',prompt=True,hide_input=True,confirmation_prompt=True)

def encrypt(password):
    click.echo('Encrypting password to %s' %password.encode('rot13'))

if __name__ =='__main__':
    encrypt()
'''
out:
$ python test.py 
Password: 
Repeat for confirmation: 
Encrypting password to 123
'''

实现类似fc命令功能

参考资料:fc命令

import click

message =click.edit()
print(message, end='')

'''
执行python test.py后,会打开vim输入我们要的数据后,保存退出,会打印出我们输入的数据。
'''

学习来自:《python linux系统管理与自动化运维》 第三章

posted @ 2020-12-20 00:37  努力吧阿团  阅读(257)  评论(0编辑  收藏  举报