五 python的命令行参数

前言

       在运行python脚本的时候需要添加许多参数,例如:dirsearch -u "xxxx.com" -e *,那么脚本程序如何接受这些命令行传递的参数呢?

       下面有四种方式,我个人觉得学习第一种和第四种即可,因为一些简单的程序可以用第一种简单一点,第四种方式是第三种方式的升级版。

0x01 sys.argv

       sys.argv以列表的方式获取运行 Python 程序的命令行参数。其中 ,sys.argv[0] 通常指该 Python程序本身,sys.argv[1]代表第一个参数,sys.argv[2]代表第二个参数,以此类推。

例如下面这段代码将获取并输出传递给其的命令行参数:

import sys

def start():
    print("程序本身:"+sys.argv[0])
    print("第一个参数:"+sys.argv[1])
    print("第二个参数:"+sys.argv[2])
    print("第三个单数"+sys.argv[3])

if __name__ == '__main__':
    try:
        start()
    except KeyboardInterrupt:
        print("interrupted by user,killing all threads...")

运行结果:

在这里插入图片描述

0x02 getopt

       getopt是对sys.argv获取的命令行参数进行二次处理。在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能,比如-u代表后面是用户,-p代表后面是密码。调用getopt.getopt()会返回两个列表,第一个列表赋值给opts,第二个列表赋值给args:
       简单点来说,就是将选项赋值给opts,将值赋给args。比如namp -sS www.baidu.com,中-sS会赋值给opts,www.baidu.com会赋值给args。

例如下面这段代码

import sys, getopt

opts, args = getopt.getopt(sys.argv[1:], "u:h", ["help","file="])

print("opt输出结果为:", opts)
print("argv输出结果为:", args)
  • 使用 sys.argv[1:] 是为过滤第一个参数(第一个参数为Python程序本身)
  • “u:h” 为定义短格式选项(-)。这里的h和u为两个选项。“h” 后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。
  • [“help”, “file=”] 为定义长格式选项(–)。这里的 “=” 和上面的短格式选项中的 “:” 一样,后面必须有选项值。

运行结果:
在这里插入图片描述

0x02 optparse

       optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数,与getopt函数不同的是optparse可以自动生成帮助信息。
在这里插入图片描述
optparse.OptionParser(usage).add_option()参数:

  • 可以设置多个选项字符串,比如上面的 ‘-u’, ‘–user’ 这两个,用的时候任选其一;
  • dest=用于定义选项值存放的位置,作为后面的第一个字典(options)的键,值为命令输入的参数;
  • type用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float等类型;
  • help用于定义帮助信息;
  • default设置默认值;

0x04 argparse(重点)

       argparse是optparse模块的升级版,与optparse相比,argparse模块使用更加简单便捷,其使用效果如下图所示。相信未来argparse会逐渐替代optparse。

代码示例:

import argparse

def start():
    parser = argparse.ArgumentParser()
    parser.add_argument('-u', '--user', dest='User', type=str, default='root', help='target User')
    parser.add_argument('-s', '--sex', dest='Sex', type=str, choices=['男', '女'], default='男', help='target Sex')
    parser.add_argument('-n', '--number', dest='Num', nargs=2, required=True, type=int, help='target Two Numbers')
    print(parser.parse_args().User,parser.parse_args().Sex,parser.parse_args().Num)

if __name__ == '__main__':
    try:
        start()
    except KeyboardInterrupt:
        print("interrupted by user, killing all threads...")

使用流程:
1. 创建一个解析对象parser

parser = argparse.ArgumentParser(description='Process some intergers.')

使用argparser的第一步是创建一个ArgumentParser对象,ArgumentParser对象包含将命令行解析成Python数据类型所需的全部信息。

  • description - 在参数帮助文档之后显示的文本 (默认值:无)

2. 然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项

parser.add_argument('-u', '--user', dest='User', type=str, default='root', help='target User')
  • name/flags:参数的名字

  • action:遇到参数时的动作,默认值时store(存储)。

  • default - 当参数未在命令行中出现时使用的值

  • dest:解析后的参数名称

  • type - 为参数类型,例如int

  • choices - 用来选择输入参数的范围。例如choice = [1, 5, 10], 表示输入参数只能为1,5 或10

  • help - 用来描述这个选项的作用

  • nargs:参数的个数,可以时具体的数字,或者是+号或者*号。* :0或者多个参数,+:1个或多个参数。

  • required:可选参数是否可以省略

3. 最后调用parse_args()方法进行解析;解析成功之后即可使用。

parser.parse_args().User

使用parser.parse_args()来获取参数,这里的User是前面dest定义的名字

0x05 实战

使用argparse写一个ping网址的脚本,-u接受要ping的网址

import argparse
import os

def ping():
    parse = argparse.ArgumentParser()
    parse.add_argument('-u', '--url', dest='url', nargs=1, type=str, required=True)
    url = parse.parse_args().url
    cmd = "ping "+url[0]
    os.system(cmd)


if __name__ == '__main__':
    try:
        ping()
    except BaseException as e:
        print(e)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值