个性化阅读
专注于IT技术分析

Python中的参数解析

点击下载

本文概述

如果你计划数据科学或机器学习项目, 那么开始在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中的参数解析1

但是, 你可以为ls命令提供许多选项, 例如-l。让我们看一下输出结果:

Python中的参数解析2

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

Python中的参数解析3

那么, 选项和参数之间有什么区别?现在已经很明显了。选项是可选的, 而自变量(通常)是必需的。不必将任何内容传递给ls命令以使其产生任何输出。

现在, 当你键入ls -l或rm demo.txt时, 操作系统会在后台以某种方式对其进行解析。此机制通常由操作系统的开发人员指定, 称为解析。

如果你想了解更多Linux命令以及它们支持的不同选项和参数, 则强烈建议阅读Unix概念和应用程序一书。

因此, 这是参数解析的基本介绍。几乎所有的编程语言都支持参数解析。 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 sys

print('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 = 0

try:
    # 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中的参数解析4

请注意, 以上脚本未定义为处理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中的参数解析5

请注意, 使用argparse简化了该过程。

下一步是什么?

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

赞(0)
未经允许不得转载:srcmini » Python中的参数解析

评论 抢沙发

评论前必须登录!