获取命令行参数
获取命令行参数的三种方法
- 使用sys.argv获取
- 使用argparse.ArgumentParser类获取
- 使用第三方库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系统管理与自动化运维》 第三章
今天的学习是为了以后的工作更加的轻松!