我是靠谱客的博主 苗条宝马,最近开发中收集的这篇文章主要介绍python基础____学习笔记17 (命令行参数解析),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、使用argparse 解析命令行参数

argparse 函数 ArgumentParser() 来创建一个解析器,该解析器调用add_argument() 来创建不同的参数选项,参数action触发不同的配置

action 支持值:

  •     store:默认action模式,存储值到指定变量。
  •     store_const:存储值在参数的const部分指定,多用于实现非布尔的命令行flag。
  •     store_true / store_false:布尔开关。可以2个参数对应一个变量。
  •     append:存储值到列表,该参数可以重复使用。
  •     append_const:存储值到列表,存储值在参数的const部分指定。
  •     version:输出版本信息然后退出。

default:
     没有设置值情况下的默认参数


type:参数类型

  •    str  默认值
  •    int 
  •    bool
  •    float

required: 
    如果设置了required=True,则在实际运行的时候不设置该参数将报错


choices:
         参数值只能从几个选项里面选择


dest:
         设置参数在代码中的变量名


nargs:
         设置参数在使用可以提供的个数
 

例子:  运行python 程序,需要提供主机名,端口号 、用户名、密码、

import argparse
def _argparase():
parse = argparse.ArgumentParser('cmd line parse')
# 添加主机名参数 变量名为host, 必须填
parse.add_argument('--host', action='store', dest='host', help='Server IP to use for connection',
default='192.168.2.5', type=str, required=True)
# 添加端口号参数 变量名为port, 默认9908, int类型,非必填
parse.add_argument('-P', '--port', action='store', dest='port', help='port number to use for connection',
default=9908, type=int, required=False)
# 添加用户名参数 变量名为user, 必须填
parse.add_argument('-u', '--user', action='store', dest='user', required=True)
# 添加密码参数 变量名为passwd, 必须填
parse.add_argument('-p', action='store', dest='passwd', required=True)
#
parse.add_argument('-v','--version', action='version', version='%(prog)s 2.0')
# 返回的是一个字典
return parse.parse_args()
if __name__ == '__main__':
parser = _argparase()
# 创建字典
connArg = dict(host=parser.host, port=parser.port, user=parser.user, passwd=parser.passwd)
print(connArg)

可以自动生成帮助信息

#python3 argparaseTest.py --help
usage: cmd line parse [-h] --host HOST [-P PORT] -u USER -p PASSWD [-v]
optional arguments:
-h, --help
show this help message and exit
--host HOST
Server IP to use for connection
-P PORT, --port PORT
port number to use for connection
-u USER, --user USER
-p PASSWD
-v, --version
show program's version number and exit
#python3 main.py --host=192.168.2.150 -P=9910 -u=kai -p=123456
输出
{'host': '192.168.2.150', 'user': 'kai', 'passwd': '123456', 'port': 9910}

 

参考资料: https://docs.python.org/3/library/argparse.html
 

二、使用Click 模块解析命令行参数

click 官方文档:https://click.palletsprojects.com/en/7.x/

Click对argparse的主要改在在于易用性,使用click模块主要分为两个步骤:

  •      使用@click.command() 装饰一个函数,使之成为命令行接口
  •      使用@click.option() 等装饰函数,为其添加命令行选项

下列为click官方提供的例子:

import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@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."""	# 会当作help信息进行输出
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()

echo :输出结果,使用 echo 进行输出是为了获得更好的兼容性,兼容 python2 和python3

click.option  最基本的用法就是通过指定命令行选项的名称,从命令行读取参数值,再将其传递给函数。我们除了设置命令行选项的名称,我们还会指定默认值,help 说明等,

option 常用的设置参数如下:

  •     default: 设置命令行参数的默认值
  •     help: 参数说明
  •     type: 参数类型,可以是 str, int, float 等
  •     prompt: 当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入可以指定 True或特定字符串来提示用户输入
  •     nargs: 指定命令行参数接收的值的个数, -1 表示可以接收多个参数 
  •    required:是否是必填参数

和 argparse类似,--help 也能显示帮助信息

#python3 clickTest.py --help
Usage: clickTest.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.

例1:
若参数需要提供 主机名,端口号 、用户名、密码、位置、加密方式

import click
@click.command()
@click.option('--serverip', type=str, prompt='Input Server Ip address',required=True)
@click.option('--serverport',type=int, default=9988,prompt='Input Server Port',required=False)
@click.option('--user', type=str, prompt='Input user name',required=True)
@click.option('--passwd', type=str, prompt='Input user passwrod',required=True)
@click.option('--pos', nargs=2 , type=int,prompt='Input Pos info x y',required=False)
@click.option('--encode', type=click.Choice(['md5','sha1']), prompt='Input encode way',required=False)
def getcommand(serverip,serverport,user,passwd,pos,encode):
click.echo(serverip)
click.echo(serverport)
click.echo(user)
click.echo(passwd)
click.echo(pos)
click.echo(encode)
if __name__ == '__main__':
getcommand()

在控制台执行命令:

# python3 clickTest.py --serverip 192.168.2.5 --serverport 9898 --user root --passwd 123456 --pos 78 91 --encode sha1
192.168.2.5
9898
root
123456
(78, 91)
sha1

注意: 参数名 serverip 这些都不能包含大写字母

例2:
密码输入. argparse 模块输入的密码 保存到了history中,通过查看历史列表能看到输入的密码,click 能很好解决这个问题,设置hide_input为True,就能隐藏密码,设置confirmation_prompt为True,就可以进行密码的两次验证,

import click
@click.command()
@click.option('-p', prompt='Your Password', hide_input=True, confirmation_prompt=True)
def getpassword(p):
click.echo('Your Password is : %s' % p)
if __name__ == '__main__':
print(------'in main---------')
getpassword()

例3: click.argument
 使用@click.option 来添加可选参数,使用 @click.argument 来添加固定参数。他的功能比@click.option  少

import click
@click.command()
@click.option('--count', type=int, default=2, help='the max time try to open file')
@click.argument('filename')
def touch(count, filename):
for x in range(count):
click.echo(filename)
if __name__ == '__main__':
touch()

例4: command 和group
 

import click
@click.group()
@click.option('--count', type=int, default=2, help='the max time try to open file')
def touch(count):
for x in range(count):
click.echo('----111---')
@touch.command()
def openfile():
click.echo('open file')
@touch.command()
def closefile():
click.echo('close file')
if __name__ == '__main__':
touch()

@click.group 装饰器把touch方法装饰为可以拥有多个子命令的Group对象, 该Group对象通过 @touch.command 装饰将 openfile方法、closefile方法  设置为它的子命令

root@kaifa:/mnt/hgfs/Ubuntu_Share# python3
clickTest.py --count
3 closefile
----111---
----111---
----111---
close file

注意; 运行时 必须添加 一个子命令,并且只能由一个.

最后

以上就是苗条宝马为你收集整理的python基础____学习笔记17 (命令行参数解析)的全部内容,希望文章能够帮你解决python基础____学习笔记17 (命令行参数解析)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部