如果您涉及使用Python进行数据处理和分析,那么迟早您将不得不超越Jupyter Notebook,将您的代码转换为可以使用命令行运行的脚本。 这是argparse模块派上用场的地方。 对于习惯了Jupyter Notebook的初学者来说,此步骤意味着需要离开舒适区并进入新的环境。 为了便于这种过渡,编写了该材料(我们今天将其翻译发表)。
Argparse模块Argparse模块
argparse模块可以与自然力相提并论,自然力已经架起了耸立在云层之上的山峰。 由于脚本中有此模块,因此可以处理不使用这些脚本代码中隐藏的内容。
应该注意的是,
argparse是推荐用于命令行参数的标准Python库模块。 我找不到适合初学者的优秀argparse指南,因此我决定自己编写这样的指南。
Jupyter Notebook之外的生活
当我第一次用Python脚本遇到argparse时,这是我在业余时间做的一个项目所需要的,我想:“这是什么神秘的构造?” 此后,我迅速将代码转移到了Jupyter Notebook,但事实证明这样的举动是不合理的。
我需要能够仅运行脚本,而不能使用Jupyter Notebook使用它。 使用argparse模块的独立脚本将更容易使用,对其进行处理比依靠Jupyter Notebook的功能更容易。 但是,当时我很着急,当我查看argparse文档时,我无法立即掌握其本质,因此没有使用脚本的原始版本。
从那时起,我想出了argparse,我真的很喜欢这个模块。 现在,我认为它绝对至关重要。 但是,掌握它并不是那么困难。
为什么我们需要argparse模块?
argparse模块允许您解析从命令行运行时传递给脚本的参数,并可以在脚本中使用这些参数。 也就是说,我们正在谈论一个事实,即该模块允许脚本在启动时提供一些数据,并且脚本将能够在其代码执行期间使用这些数据。 argparse模块是一种工具,您可以使用它来在程序作者与使用它的人之间建立通信,例如,当您今天编写脚本时与您明天启动脚本时,您之间可以进行通信。
使用argparse意味着,如果需要,可以更改脚本的行为,或者,如果脚本的作者提供了数据,则可以将一些数据传输到该脚本,用户无需编辑程序代码。 结果,脚本获得了一定程度的灵活性。
例子
假设您想编写一个脚本,使用
OpenCV库将视频文件转换为常规图像。 为了使脚本解决此问题,它需要知道视频文件的存储位置,以及放置完成图像的位置。 也就是说,他需要有关两个文件夹的信息,这不是很方便,可以在脚本代码中硬编码到这些文件夹的路径,或者更好的是,您可以让用户在运行脚本时通过将其作为命令行参数输入来指定脚本。 为了给脚本提供这样的机会,argparse模块对我们很有用。 这是脚本部分的样子(我们将此脚本
videos.py
),其中解析了命令行参数:
此处,在文件开头,导入了argparse模块。 然后,使用
argparse.ArgumentParser()
构造,创建一个带有其描述的
parser
对象。 接下来,使用
parser.add_argument()
方法
indir
parser.add_argument()
变量,该变量计划在其中将路径写入包含视频文件的文件夹。 同时,表明它具有字符串类型,并且还设置了有关它的参考信息。 之后,以相同的方式
outdir
变量,在该路径中,将获得脚本必须放置基于视频文件创建的图像的文件夹的路径。 下一步,解析命令行参数的结果将进入
args
变量。 现在,启动时传递给脚本的内容将作为
args
对象的
indir
和
outdir
属性可用。 现在,您可以使用这些值。 在这种情况下,我们只需将
indir
参数中传递给脚本的内容打印到控制台即可。
以下是从命令行运行此脚本的方法:
python videos.py /videos /images
请注意,行
/videos
和
/images
不需要用引号引起来。 以这种方式启动的脚本会将线路
/videos
输出到终端,从而确认了在其代码中使用传递给它的参数的可能性。 这就是argparse的魔力。
解析命令行参数的魔力Argparse详细信息
我们只是看了一个简单的argparse示例。 现在让我们讨论有关argparse的一些细节。
▍位置参数
从
videos.py
脚本构造
parser.add_argument('indir', type=str, help='Input dir for videos')
形式
parser.add_argument('indir', type=str, help='Input dir for videos')
的目的是创建一个位置参数。 调用脚本时,指定此类参数的顺序很重要。 因此,传递给脚本的第一个参数成为第一个位置参数,第二个参数成为第二个位置参数。
如果通过在终端中运行
python videos.py
命令来在没有任何参数的情况下运行脚本,会发生什么情况?
在这种情况下,将显示以下错误消息:
videos.py: error: the following arguments are required: indir, outdir
结果,事实证明,为了运行提供使用位置参数的脚本,应始终在运行时指定此类参数。
▍可选参数
当我们的脚本使用
python videos.py --help
命令运行时会发生什么?
作为响应,将显示有关它的帮助信息。 这正是我们在描述相应变量时指示的关于位置参数的信息:
usage: videos.py [-h] indir outdir Videos to images positional arguments: indir Input dir for videos outdir Output dir for image optional arguments: -h, --help show this help message and exit
该脚本告诉我们很多有关用户期望的有趣的事情,
help
是可选参数的示例。 请注意,
--help
(或
-h
)是我们在使用argparse时可以使用的唯一标准可选参数,但是如果需要其他可选参数,则可以自己创建它们。
可选参数的创建方式与位置参数的创建方式相同。 用于创建它们的命令之间的主要区别在于,当指定此类自变量的名称时,这些名称以字符序列
--
开头,或者对于简短形式的自变量以字符
-
开头。 例如,可以这样创建一个可选参数:
parser.add_argument('-m', '--my_optional')
这是如何创建和使用可选参数的示例。 请注意,在此处描述可选参数时,我们将其类型指定为
int
。 即是整数。 在类似情况下,您可以使用其他类型的Python。
描述为
--my_optional
的参数在程序中作为名为
my_optional
的
my_namespace
对象的属性提供。
可以为可选参数分配默认情况下将具有的值。 在我们的例子中,如果在
my_example
脚本时未给
my_example
参数
my_example
,则将数字2写入其中,并将其输出到控制台。 为了在脚本执行期间设置此参数的值,可以使用以下构造:
python my_example.py --my_optional=3
argparse还有什么用?
argparse模块可用于开发计划打包在Docker容器中的Python应用程序。 因此,例如,如果启动包装在容器中的应用程序时,需要将命令行参数传递给它,则可以在Dockerfile中的容器组装阶段使用
RUN
指令对其进行描述。 您可以使用
CMD
或
ENTRYPOINT
指令在容器
ENTRYPOINT
期间运行脚本。 可以在
此处找到有关Dockerfile的详细信息。
总结
我们研究了使用argparse模块的基本方法,您可以使用这些基本方法为脚本配备接受和处理命令行参数的能力。 应该注意的是,argparse功能不止于此。 例如,在描述参数时使用
nargs参数可以
处理参数列表,而
choices参数则可以指定参数可以采用的值集。 实际上,现在,您已经掌握了argparse的主要功能,可以很轻松地使用该
文档的文档来更深入地研究此模块。
如果您习惯于使用Jupyter Notebook,并且希望摆脱这种做法,
那么您 可以 在这里找到有关使用环境变量的材料。
这是 repo2docker工具上
的资料,该
工具使您可以将Jupyter Notebook存储库转换为Docker映像。
亲爱的读者们! 您如何在Python脚本中使用命令行参数?
