🚀write in front🚀
🔎大家好,我是翻斗花园牛爷爷★。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🆔本文由 翻斗花园牛爷爷★ 原创 CSDN首发🐒 如需转载还请通知⚠
📝个人主页:翻斗花园牛爷爷★—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:翻斗花园牛爷爷★的系列专栏——CSDN博客
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本
目录
一般服务器都是linux操作系统并且是无图形界面的,所以进行任何操作都是通过命令行。一些命令行工具的使用能够大大简化代码脚本的维护成本,提升复用性,今天主要是借助于python提供的几种主流的参数解析工具来实现简单的功能。
本次,主要讲解四种命令行的处理方式:
1.sys
2.getopt
3.optparse
4.argparse
1.sys
首先,我们来了解一下sys模块;sys模块主要用于获取和Python解释器相关的信息。
我们可以先用dir()来获取对象的所有属性和方法的列表。
import sys #导入模块
print(dir(sys))
让我们来看看结果:
是不是相当多,这些就是我们获得的sys的所有属性和方法的列表。
简单的了解了sys后,要开始讲一下sys.argv;它的第一个方法。
sys.argv: 以列表的方式获取运行 Python 程序的命令行参数。它的第一个参数是程序本身。所以这里另定第一个参数。用代码演示一下:
import sys
def start(argv):
print('程序名:',argv[0])
print('第一个参数:',argv[1])
print('第二个参数:',argv[2])
print('第三个参数:',argv[3])
if __name__=='__main__':
try:
start(sys.argv[0:]) #遍历从argv[0]开始到结束。
except KeyboardInterrupt:
print("非法错误")
用终端演示一下:
好的,简单的讲解sys后,要开始下一个模块了。🤙🤙🤙
2.getopt
getopt是对sys.argv获取的命令行参数进行二次处理。在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能,比如-u代表后面是用户,-p代表后面是密码。调用getopt.getopt()会返回两个列表,第一个列表赋值给opts,第二个列表赋值给args:
opts:是 (选项, 选项值) 的元组为一个元素的列表。如果没有选项值为空字符串;
args:存放没用选项单参数的列表。不属于格式信息的剩余的命令行参数;
可能大家并不是很理解,没关系,用代码给大家演示一遍,大家就能理解了。😁😁😁
import sys,getopt
opts,args=getopt.getopt(sys.argv[1:],"u:p:",["file="]) #这里从1开始是为了过滤程序本身
print("opts输出结果为:",opts)
print("args输出结果为:",args)
在终端执行一下
对比这两个结果,大家发现了什么 ;在这里,‘-u’和‘root’作为选项和选项值,就是属于格式信息。而本来’-p‘和’666666‘也是作为格式信息的,但是被sdwadad这串字符串改变了。所以就作为存放没用选项单参数的列表。由args进行输出了。
用代码演示一下:
import sys, getopt
def banner():
print('\033[1;34m########################################################################################\033[0m\n'
'\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
'\033[1;34m########################################################################################\033[0m\n')
def usage():
print('-h: --help 帮助;')
print('-u: --url 域名;')
print('eg: python -u "www.baidu.com" ')
def start(argv):
url = ""
file = "" #待输入
if len(argv) < 1: #输入的命令行长度小于1就会执行-h
print("-h 帮助信息;\n")
sys.exit()
try:
banner()
opts, args = getopt.getopt(argv, "-u:-h",["help","file="])#‘h’后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。
except getopt.GetoptError:
print('Error')
sys.exit()
for opt, arg in opts:
if opt == "-u":
url = arg
elif opt == "--file":
file = arg
elif (opt == "-h") or (opt == "--help"):
usage()
if (len(url)>0) or (len(file)>0):
print(url,file)
if __name__ == '__main__':
try:
start(sys.argv[1:])
except KeyboardInterrupt:
print("非法输入")
注意:1.使用 sys.argv[1:] 是为过滤第一个参数(第一个参数为Python程序本身)
2.“u:h” 为定义短格式选项(-)。这里的h和u为两个选项。“h” 后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。
3.[“help”, “file=”] 为定义长格式选项(--)。这里的 “=” 和上面的短格式选项中的 “:” 一样,后面必须有选项值。
因此在终端使用命令时要看请是否有:,以此来判断是否需要输入选项值。
如果输入的不符合格式;就会返回ERROR
3.optparse
optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数,与getopt函数不同的是optparse可以自动生成帮助信息。
用代码帮助大家理解一下:
import optparse
def banner():
print('\033[1;34m########################################################################################\033[0m\n'
'\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
'\033[1;34m########################################################################################\033[0m\n')
def start():
banner()
usage = "python %prog -u/--user <target user> -p/--password <target password>"
parser = optparse.OptionParser(usage)
parser.add_option('-u', '--user', dest='User', type='string', help='target user', default='root')
parser.add_option('-p', '--password', dest='Pwd', type='string', help='target password')
options, args = parser.parse_args()
print("用户名为", options.User)
print("密码为", options.Pwd)
if __name__ == '__main__':
try:
start()
except KeyboardInterrupt:
print("error")
大家可能会有疑惑,发现了很多不了解的函数。没关系,慢慢来;👍👍👍
首先是optparse.OptionParser(usage).add_option()参数:
- 可以设置多个选项字符串,比如上面的 ‘-u’, ‘--user’ 这两个,用的时候任选其一;
- dest=用于定义选项值存放的位置,作为后面的第一个字典(options)的键,值为命令输入的参数;
- type用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float等类型;
- help用于定义帮助信息;
- default设置默认值;
而%prog在这里代表的是argv[0],也就是程序本身
使用add_option()方法向parser对象中添加选项,包括"-u/--user"选项和"-p/--password"选项。其中,-u和-p是短选项,--user和--password是长选项;
调用parse_args()方法来解析命令行参数,并将解析结果赋值给options和args两个变量。options是一个Namespace对象,包含了命令行参数的值,可以通过.options来访问它们。
1;34m是ANSI转义序列的一部分,用于控制终端输出的颜色。具体来说,1代表加粗文本,34代表蓝色文本。其他的具体不再讲,感兴趣的小伙伴们可以自行百度。
我们可以看到-h自动生成帮助信息。
4.argparse
argparse是optparse模块的升级版,与optparse相比,argparse模块使用更加简单便捷。
我整理了一下它们的区别:
1.argparse是Python标准库中较新的命令行参数解析模块,而optparse是旧版本Python中的命令行参数解析模块。
2.支持的Python版本:argparse从Python2.7开始引入,而optparse在Python2.3被引入,不过在Python3中已经不推荐使用。
3.参数类型:argparse支持的参数类型更多,包括字符串、整数、浮点数、布尔值等,而optparse只支持字符串和整数。
4.参数默认值:argparse中可以指定参数的默认值,而optparse不支持参数的默认值。
5.子命令支持:argparse支持解析带有子命令的命令行参数,而optparse不支持。等等。
这并不是全部,这里我只简要说了几个,感兴趣的小伙伴可以自行百度一下。😬😬😬
下面用代码进行演示一遍:
import argparse
def banner():
print('\033[1;34m########################################################################################\033[0m\n'
'\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
'\033[1;34m########################################################################################\033[0m\n')
def start():
banner()
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("非法输入")
argparse.ArgumentParser().add_argument 参数设定与上面的optparse一样。这里就不再水文字里😈😈😈
先看一下它的帮助信息-h
再按格式执行命令:
本次为大家讲解了一些基于python的命令行参数,希望大家能够从中收获到东西。
创作不易,希望大佬们以及未来的大佬们给个三连再走吧
创作不易,希望大佬们以及未来的大佬们给个三连再走吧
创作不易,希望大佬们以及未来的大佬们给个三连再走吧
同时,也希望各位大佬能够指正文章的错误,(^_^)∠※
当然也要提醒各位小伙伴们,只有自己打出来,才能真正的掌握哦。😁😁😁