为您的 Python 脚本设置命令行参数

进行机器学习项目意味着我们需要进行实验。拥有一种轻松配置脚本的方法将帮助您更快地工作。在 Python 中,我们有一种方法可以从命令行调整代码。在本教程中,我们将了解如何利用 Python 脚本的命令行参数来帮助您更好地完成机器学习项目。

完成本教程后,你将学到:

  • 为什么我们希望在命令行中控制 Python 脚本
  • 如何高效地在命令行中工作

使用我的新书《Python 机器学习启动您的项目,其中包括逐步教程和所有示例的Python 源代码文件。

让我们开始吧。

您的 Python 脚本的命令行参数。照片来自 insung yoon。保留部分权利

概述

本教程分为三个部分;它们是

  • 在命令行中运行 Python 脚本
  • 在命令行中工作
  • 命令行参数的替代方案

在命令行中运行 Python 脚本

运行 Python 脚本有多种方式。有些人可能将其作为 Jupyter notebook 的一部分运行。有些人可能在 IDE 中运行。但在所有平台上,始终可以在命令行中运行 Python 脚本。在 Windows 中,您有命令提示符或 PowerShell(或者,更好的是,Windows Terminal)。在 macOS 或 Linux 中,您有 Terminal 或 xterm。在命令行中运行 Python 脚本功能强大,因为您可以向脚本传递额外的参数。

以下脚本允许我们从命令行将值传递到 Python

我们将这几行保存到一个文件中,并在命令行中带一个参数运行它

然后,您将看到它获取我们的参数,将其转换为整数,加一,然后打印。列表 sys.argv 包含我们的脚本名称和所有参数(所有字符串),在上述情况下,它是 ["commandline.py", "15"]

当您使用更复杂的参数集运行命令行时,处理列表 sys.argv 需要一些努力。因此,Python 提供了 argparse 库来帮助。这假设是 GNU 风格,可以用以下示例解释

可选参数由“-”或“--”引入,其中单个连字符表示单个字符的“短选项”(如上面的 -a-B-v),两个连字符表示多个字符的“长选项”(如上面的 --exclude--ignore-existing)。可选参数可能包含额外的参数,例如 -B 1024--exclude="*.pyc";其中 1024"*.pyc" 分别是 -B--exclude 的参数。此外,我们可能还有必选参数,我们只需将其放入命令行。上面的 192.168.0.3:/tmp/./ 部分就是示例。必选参数的顺序很重要。例如,上面的 rsync 命令将文件从 192.168.0.3:/tmp/ 复制到 ./,而不是反过来。

以下是使用 argparse 在 Python 中复制上述示例的代码

如果您运行上述脚本,您将看到

这意味着您没有为 srcdest 提供必需的参数。也许使用 argparse 的最佳原因是,如果您提供了 -h--help 作为参数,就可以免费获得帮助屏幕,如下所示

虽然脚本没有做任何实际操作,但如果您按照要求提供了参数,您将看到

ArgumentParser() 创建的解析器对象具有 parse_args() 方法,该方法读取 sys.argv 并返回一个命名空间对象。这是一个带有属性的对象,我们可以例如使用 args.ignore_existing 来读取它们。但通常,如果它是一个 Python 字典,处理起来会更容易。因此,我们可以使用 vars(args) 将其转换为字典。

通常,对于所有可选参数,我们提供长选项,有时也提供短选项。然后,我们可以使用长选项作为键(如果不是长版本,则将连字符替换为下划线或单字符短选项作为键)来访问从命令行提供的值。“位置参数”不是可选的,它们的名称在 add_argument() 函数中提供。

有多种类型的参数。对于可选参数,有时我们将其用作布尔标志,但有时我们期望它们带来一些数据。在上面,我们使用 action="store_true" 使该选项默认为 False,如果指定则切换为 True。对于其他选项,例如上面的 -B,默认情况下,它期望后面跟着额外的数据。

我们可以进一步要求参数为特定类型。例如,在上面的 -B 选项中,我们可以通过添加 type 如下所示使其期望整数数据

如果我们提供了错误的类型,argparse 将会终止我们的程序并显示一个有用的错误消息

在命令行中工作

使用命令行参数增强您的 Python 脚本可以使其可重用性达到一个新的水平。首先,让我们看一个将 ARIMA 模型拟合到 GDP 时间序列的简单示例。世界银行收集了许多国家的历史 GDP 数据。我们可以使用 pandas_datareader 包来读取数据。如果您尚未安装它,可以使用 pip(如果您安装了 Anaconda,则使用 conda)来安装该包

我们使用的 GDP 数据代码是 NY.GDP.MKTP.CN;我们可以通过以下方式获取一个国家的 pandas DataFrame 形式的数据

然后我们可以使用 pandas 提供的工具对 DataFrame 进行一些整理

拟合 ARIMA 模型并使用该模型进行预测并不困难。在下文中,我们使用前 40 个数据点进行拟合,并预测接下来的 3 个数据点。然后,根据相对误差将预测与实际值进行比较

将所有代码放在一起,并稍作润色,以下是完整的代码

此脚本打印以下输出

上述代码虽然简短,但我们通过将一些参数保存在变量中使其足够灵活。我们可以将上述代码更改为使用 argparse,以便我们可以从命令行更改一些参数,如下所示

如果我们从命令行运行上面的代码,我们可以看到它现在可以接受参数

在上面的最后一个命令中,我们传入 -c NO 以将相同的模型应用于挪威(NO)而不是瑞典(SE)的 GDP 数据。因此,在不弄乱代码的情况下,我们重复使用了我们的代码来处理不同的数据集。

引入命令行参数的强大之处在于,我们可以轻松地使用不同的参数测试我们的代码。例如,我们想看看 ARIMA(1,1,1) 模型是否是预测 GDP 的好模型,并且我们想用北欧国家的不同时间窗口进行验证

  • 丹麦 (DK)
  • 芬兰 (FI)
  • 冰岛 (IS)
  • 挪威 (NO)
  • 瑞典 (SE)

我们想检查 40 年的窗口,但起始点不同(从 1960 年、1965 年、1970 年、1975 年开始)。根据操作系统,您可以使用 bash shell 语法在 Linux 和 mac 中构建一个 for 循环

或者,根据 shell 语法允许,我们可以将所有内容放在一行中

或者更好的是,在循环的每次迭代中提供一些信息,我们就可以多次运行脚本

如果您使用的是 Windows,可以在命令提示符中使用以下语法

或者在 PowerShell 中使用以下代码

两者应该产生相同的结果。

虽然我们可以在 Python 脚本中放入类似的循环,但有时在命令行中执行会更容易。当我们探索不同的选项时,它可能更方便。此外,通过将循环移出 Python 代码,我们可以确保每次运行脚本时都是独立的,因为我们不会在迭代之间共享任何变量。

命令行参数的替代方案

使用命令行参数并不是向 Python 脚本传递数据的唯一方法。至少还有其他几种方法

  • 使用环境变量
  • 使用配置文件

环境变量是操作系统用于在内存中存储少量数据的功能。我们可以使用以下语法在 Python 中读取环境变量

例如,在 Linux 中,上述两行脚本在 shell 中会如下工作

在 Windows 中,命令提示符中的语法类似

您也可以使用控制面板中的对话框在 Windows 中添加或编辑环境变量

因此,我们可以将脚本参数保存在一些环境变量中,并让脚本调整其行为,例如设置命令行参数。

如果我们需要设置很多选项,最好将选项保存到文件中,而不是让命令行不堪重负。根据我们选择的格式,我们可以使用 Python 的 configparserjson 模块分别读取 Windows INI 格式或 JSON 格式。我们也可以使用第三方库 PyYAML 来读取 YAML 格式。

对于上面在 GDP 数据上运行 ARIMA 模型的示例,我们可以修改代码以使用 YAML 配置文件

YAML 配置文件名为 config.yaml,其内容如下

然后我们可以运行上述代码并获得与之前相同的结果。JSON 对应部分非常相似,我们使用 json 模块中的 load() 函数

而 JSON 配置文件 config.json 将是

您可以了解更多关于您的项目中的 JSONYAML 语法。但这里的想法是,我们可以将数据和算法分离,以更好地重用我们的代码。

想开始学习机器学习 Python 吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

文章

书籍

总结

在本教程中,您已经了解了如何使用命令行更有效地控制 Python 脚本。具体来说,您学习了

  • 如何使用 argparse 模块向 Python 脚本传递参数
  • 如何在不同操作系统下的终端中高效控制支持 argparse 的 Python 脚本
  • 我们还可以使用环境变量或配置文件向 Python 脚本传递参数

掌握机器学习 Python!

Python For Machine Learning

更自信地用 Python 编写代码

...从学习实用的 Python 技巧开始

在我的新电子书中探索如何实现
用于机器学习的 Python

它提供自学教程数百个可运行的代码,为您提供包括以下技能:
调试性能分析鸭子类型装饰器部署等等...

向您展示高级 Python 工具箱,用于
您的项目


查看内容

您的 Python 脚本的命令行参数的 2 条回复

  1. Michael 2022 年 3 月 1 日上午 7:23 #

    你好,
    感谢您的文章。

    另一种选择是 typer。我认为它非常适合 Python 包结构。

  2. soltani Youssef 2022 年 3 月 4 日下午 6:36 #

    感谢您的文章。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。