当前位置: 首页 > Linux

Python、argparse和命令行参数

时间:2023-04-06 04:10:35 Linux

(注:本文摘自AdrianRosebrock的教程文章并翻译)1、什么是命令行参数?命令行参数是在运行时赋予程序/脚本的标志。它们包含有关程序的附加信息,以便程序可以执行。并非所有程序都有命令行参数,因为并非所有程序都需要它们。在我的博文中,Python脚本大量使用了命令行参数,甚至可以说本博客98%的文章都使用了命令行参数。2.为什么要使用命令行参数?如前所述,命令行参数在运行时为程序提供更多信息。这使我们能够在不更改代码的情况下动态地为程序提供不同的输入。以此类推,命令行参数类似于函数参数,如果你知道如何在各种编程语言中声明和调用函数,那么当你发现如何使用命令行参数时,你会立即感到宾至如归。鉴于这是一个计算机视觉和图像处理博客,这里看到的许多参数都是图像路径或视频路径。在深度学习的情况下,您会看到模型路径或时间点计数作为命令行参数。在本文中,我们将通过两个脚本示例了解Pythonargparse包。3.Pythonargparselibrary首先,我们给一个新的脚本命名为simple_example.py:#importargparsepackageimportargparse#构造参数并解析参数ap=argparse.ArgumentParser()ap.add_argument("-n","--name",required=True,help="nameoftheuser")args=vars(ap.parse_args())#打印交互信息print("你好{},很高兴认识你!".format(args["name"]))添加唯一的参数,-n或--name,必须指定速记(-n)和普通版本(--name),任一标志都可以在命令行上使用。上面说了--name是必须的参数required=True。--help为可选参数,终端输入:pythonsimple_example.py--help打印出如下提示信息:usage:simple_example.py[-h]-nNAME可选参数:-h,--helpshowthishelpmessageandexit-nNAME,--nameNAME用户名输入以下命令运行脚本:pythonsimple_example.py--nameZheShao打印出如下结果:你好,ZheShao,很高兴认识你!只要名称没有空格,它就会在输出中正确显示。4.使用Python解析命令行参数第二个脚本shape_counter.py:#USAGE#pythonshape_counter.py--inputinput_01.png--outputoutput_01.png#pythonshape_counter.py--inputinput_02.png--outputoutput_02.png#导入必要的包importargparseimportimutilsimportcv2#构造参数并解析参数ap=argparse.ArgumentParser()ap.add_argument("-i","--input",required=True,help="pathtoinputimage")ap.add_argument("-o","--output",required=True,help="输出图像的路径")args=vars(ap.parse_args())#从磁盘加载图像image=cv2.imread(args["input"])#将图像转为灰度图,高斯平滑,阈值计算和二值化gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)blurred=cv2.GaussianBlur(gray,(5,5),0)thresh=cv2.threshold(blurred,60,255,cv2.THRESH_BINARY)[1]#从图像中提取轮廓cnts=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts=imutils.grab_contours(cnts)#在输入图像上循环绘制轮廓forcincnts:cv2.drawContours(image,[c],-1,(0,0,255),2)#在图像中显示的总数shapestext="Ifound{}totalshapes".format(len(cnts))cv2.putTex格式t(image,text,(10,20),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2)#将输出图像保存到硬盘cv2.imwrite(args["output"],image)运行脚本:pythonshape_counter.py--inputinput_01.png--outputoutput_01.png使用不同的参数再次运行脚本:pythonshape_counter.py--inputinput_02.png--outputoutput_02.png最后,有一个“gotcha”要注意,有时在这个博客上,我的命令行参数标志中有一个“-”(破折号),例如--features-db在抓取参数包含的值时,需要使用“_”(下划线),有点混乱,也有点麻烦,比如下面的代码:#构造参数解析器,解析参数sap=argparse.ArgumentParser()ap.add_argument("-d","--dataset",required=True,help="Pathtothedirectoryofindexedimages")ap.add_argument("-f","--features-db",required=True,help="特征数据库的路径")ap.add_argument("-c","--codebook",required=True,help="密码本路径")ap.add_argument("-o","--output",required=True,help="Pathtooutputdirectory")args=vars(ap.parse_args())#加载密码本并打开特征数据库vocab=pickle.loads(open(args["codebook"],"rb").read())featuresDB=h5py.File(args["features_db"],mode="r")print("[INFO]起始距离计算...")因为argparse库在解析过程中,Python使用Underscores代替破折号。