Python中的参数解析

本文概述

  • 什么是参数解析?
  • 使用sys.argv进行参数解析
  • 使用getopt进行参数解析
  • 使用argparse进行参数解析
  • 下一步是什么?
如果你计划数据科学或机器学习项目, 那么开始在Jupyter Notebook中进行开发并不罕见。它为你的计算工具提供了交互性, 可让你快速运行模块等。有很多选择Jupyter Notebooks作为你选择的主要武器的指标, 特别是在进行数据科学或机器学习项目时。但是, 本教程并非旨在阐明这一部分。
考虑到你需要将Python脚本作为批处理作业运行, 以便在数据科学项目中提取数据。或者你需要运行Python脚本以将机器学习模型部署到远程服务器。在这种情况下, 仅执行python your_script.py可能还不够。你可能需要将更多选项或参数与python your_script.py一起传递。你可能已经在Linux终端上运行命令(例如ps, ls等)时熟悉了其他参数的用法。
在本教程中, 你将学习如何解析与Python脚本一起传递的其他参数, 命令行中的选项。以下是本教程内容的摘要:
  • 参数解析的基本介绍
  • Python中的参数解析
    • 使用sys.argv
    • 使用getopt
    • 使用argparse
请注意, 本教程假定你对Python基本熟悉。
什么是参数解析? 我敢打赌, 如果你是Linux用户, 那么你可能已经知道这一点。为了获得特定目录中存在的文件和文件夹的摘要, 经常使用命令ls。运行ls命令的典型输出如下所示:
Python中的参数解析

文章图片
但是, 你可以为ls命令提供许多选项, 例如-l。让我们看一下输出结果:
Python中的参数解析

文章图片
通过传递-l选项, 你可以获得更多信息。现在, 在这种情况下, 选项和参数之间略有不同。要从当前工作目录中删除文件或文件夹, 通常使用rm命令。假设你有一个名为demo.txt的文本文件, 并且运行rm demo.txt来删除该文本文件。在这种情况下, demo.txt是你应用于rm命令的参数。如果你没有将任何参数传递给rm命令, 则会收到类似以下的错误-
Python中的参数解析

文章图片
那么, 选项和参数之间有什么区别?现在已经很明显了。选项是可选的, 而自变量(通常)是必需的。不必将任何内容传递给ls命令以使其产生任何输出。
现在, 当你键入ls -l或rm demo.txt时, 操作系统会在后台以某种方式对其进行解析。此机制通常由操作系统的开发人员指定, 称为解析。
如果你想了解更多Linux命令以及它们支持的不同选项和参数, 则强烈建议阅读Unix概念和应用程序一书。
【Python中的参数解析】因此, 这是参数解析的基本介绍。几乎所有的编程语言都支持参数解析。 Python也不例外。在Python中可以使用三种非常普遍的方式进行参数解析-
  • sys.argv
  • 小费
  • 离合器
现在, 你将一个一个地使用上述每个选项, 并了解如何使用它们来解析参数(和选项)。让我们按时间顺序走。
使用sys.argv进行参数解析 让我们开始简单。在第一个示例中, 你将创建一个名为demo1.py的Python文件。你的程序在执行时将接受从命令行(或终端)传递的任意数量的参数。程序将打印出传递的参数和参数总数。
例如, 如果你执行python demo1.py abc 123, 则程序将产生-
Number of arguments: 3 Argument(s) passed: ['demo1.py', 'abc', '123']

请注意, 第一个参数始终是Python文件的名称。但是代码可以修改为不包含它。
现在来看代码-
import sysprint('Number of arguments: {}'.format(len(sys.argv))) print('Argument(s) passed: {}'.format(str(sys.argv)))

首先, 你导入了Python模块sys, 该模块随附了Python的标准安装。然后, 你使用了argv子模块, 该子模块返回传递给Python脚本的参数列表, 其中argv [0]包含Python脚本的名称。如果在如下所示的代码单元中运行sys.argv, 则将获得负责使IPython内核正常运行的配置文件列表。最好不要惹他们。
sys.argv

['/home/nbuser/anaconda3_501/lib/python3.6/site-packages/ipykernel/__main__.py', '-f', '/home/nbuser/.local/share/jupyter/runtime/kernel-dabba4f7-e3e0-4c39-99d2-261ba835c53f.json']

现在让我们看看如何使用getopt模块来解析参数(和选项)。
使用getopt进行参数解析 与sys.argv相比, getopt模块提供了更多的灵活性。让我们首先设计一个示例方案, 然后相应地编写代码。
假设你已经发布了尚未记录的Python脚本。但是, 你希望能够以一种非预期的方式向用户提供有意义的反馈。你的Python脚本完成了将两个数字相加并提供输出的简单任务。唯一的限制是用户需要以命令行参数的形式将输入内容与Python脚本一起传递。
实际讲一点, 理想情况下, 脚本应按以下方式执行:
python add_numbers.py -a 3 -b 8
输出应为11。这里, -a和-b是选项, 而3、8是你提供给脚本的参数。这些选项不仅增强了可读性, 而且还有助于确定评估流程(请考虑是否要除法而不是加法)。首先, 让我们开始看一下代码。
import getopt import sys# Get the arguments from the command-line except the filename argv = sys.argv[1:] sum = 0try: # Define the getopt parameters opts, args = getopt.getopt(argv, 'a:b:', ['foperand', 'soperand']) # Check if the options' length is 2 (can be enhanced) if len(opts) == 0 and len(opts) > 2: print ('usage: add.py -a < first_operand> -b < second_operand> ') else: # Iterate the options and get the corresponding values for opt, arg in opts: sum += int(arg) print('Sum is {}'.format(sum))except getopt.GetoptError: # Print something useful print ('usage: add.py -a < first_operand> -b < second_operand> ') sys.exit(2)

这个想法是首先使用sys.argv获取所有参数, 然后进行相应处理。现在让我们来看最重要的代码行-opts, args = getopt.getopt(argv, ‘ a:b:’ , [‘ foperand’ , ‘ soperand’ ])
getopt()方法的签名如下:
getopt.getopt(args, shortopts, longopts = [])
  • args是从命令行获取的参数列表。
  • shortopts是你指定选项字母的位置。如果提供a :, 则意味着应该为脚本提供选项a, 后跟一个值作为参数。从技术上讲, 你可以在此处使用任意数量的选项。从命令行传递这些选项时, 必须在它们前面加上” -“ 。
  • 你可以在longopts中指定shortopts的扩展版本。它们必须以” -“ 开头。
你将shortopts定义为a:b:这意味着你的Python脚本将采用两个选项作为字母-‘ a’ 和’ b’ 。通过指定” :” , 你明确地告诉这些选项后面将带有参数。
你将longopts定义为[‘ foperand’ , ‘ soperand’ ], 这是一种告诉代码接受f_operand和s_operand代替a和b作为选项的方式。但是这些应该始终遵循-。
getopt模块为你提供了一个方便的Exception类GetoptError, 它也用于定义有用的消息, 因此可以指导用户如何使用Python脚本。这就是为什么将脚本的功能部分包装在try块中并相应地定义了except块的原因。
这是运行Python脚本的方法:
Python中的参数解析

文章图片
请注意, 以上脚本未定义为处理longopts。你可以尝试做一些练习。
现在让我们看看如何使用argparse进行参数解析。
使用argparse进行参数解析 从以上两个选项来看, 它们不太可读是很可行的。一旦你看到了argparse的实际应用, 你也将同意上述两个选项在灵活性方面也缺乏。为了了解argparse的用法, 让我们从实现上一节中看到的场景的代码片段开始。
import argparse# Construct the argument parser ap = argparse.ArgumentParser()# Add the arguments to the parser ap.add_argument("-a", "--foperand", required=True, help="first operand") ap.add_argument("-b", "--soperand", required=True, help="second operand") args = vars(ap.parse_args())# Calculate the sum print("Sum is {}".format(int(args['foperand']) + int(args['soperand'])))

首先, 与上面讨论的其他两个模块一样, argparse随Python的标准安装一起提供。首先实例化argparse对象。剩下的事情变得如此简单。让我们以下面的代码行为例-
ap.add_argument(“ -a” , ” – foperand” , required = True, help =” 第一个操作数” )
在这里, 你添加了期望在Python脚本运行时提供的参数。你提供了自变量的字母形式及其扩展形式。通过指定required = True, 你明确要求用户提供该特定参数。最后, 你为参数添加了有意义的描述, 如果用户未以正确的方式执行脚本, 该描述将显示给用户。
参数定义部分对于第二个参数也相同。你可以通过指定给定参数的各自索引来访问它们。
上面的代码片段清楚显示了使用argparse定义命令行参数解析任务是多么容易和灵活。这是上面的Python脚本的玩法:
Python中的参数解析

文章图片
请注意, 使用argparse简化了该过程。
下一步是什么? 感谢你阅读今天的教程直到最后。现在, 你已经配备了本机Python模块, 该模块能够解析从命令行提供的参数以及Python脚本。作为练习, 你可以相应地自定义机器学习和数据科学项目, 以促进参数解析并将其转变为有用的脚本实用程序。不仅是机器学习或数据科学, 而且任何你认为足够相关的地方。这就是今天的教程。如果你有兴趣提高Python技能, 则可能需要学习srcmini的Python数据科学工具箱(第1部分)课程。

    推荐阅读