iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何用Python内置库创建一个命令行应用程序
  • 343
分享到

如何用Python内置库创建一个命令行应用程序

2023-07-06 04:07:24 343人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“如何用python内置库创建一个命令行应用程序”,在日常操作中,相信很多人在如何用Python内置库创建一个命令行应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python内置

这篇文章主要介绍“如何用python内置库创建一个命令行应用程序”,在日常操作中,相信很多人在如何用Python内置库创建一个命令行应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python内置库创建一个命令行应用程序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

解析参数

在学习如何使用 argparse 之前,最好知道还有一种方法可以向 Python 脚本传递参数。你可以向 Python 脚本传递任何参数,并通过使用 sys 模块访问这些参数。

为了了解它是如何工作的,创建一个名为 sys_args.py 的文件,并在其中输入以下代码:

# sys_args.py import sys def main(): print('You passed the following arguments:') print(sys.argv) if __name__ == '__main__': main()

这段代码导入sys并打印出sys.argv中的任何内容。argv属性包含了所有传递给脚本的东西的列表,其中第一项是脚本本身。

下面是一个例子,说明当你运行这段代码和几个参数的时候会发生什么。

python3 sys_args.py --s 45 You passed the following arguments: ['sys_args.py', '--s', '45']

使用sys.argv的问题是,你无法控制可以传递给你的应用程序的参数。

  • 不能忽略参数

  • 不能创建默认参数

  • 无法判断什么是有效参数

这就是为什么使用 argparse 是使用 Python 标准库的方法。argparse 模块是非常强大和有用的。让我们想一想,一个命令行应用程序所遵循的常见过程。

  • pass:传入一个文件

  • do:在你的程序中对该文件做一些处理

  • output :输出结果

下面是一个关于如何工作的通用例子。继续创建file_parser.py并添加以下代码。

# file_parser.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser('File parser') parser.add_argument('--infile', help='Input file') parser.add_argument('--out', help='Output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

file_parser()函数是进行解析的逻辑所在。在这个例子中,它只接收一个文件名,并将其打印出来。output_file参数的默认值是一个空字符串

程序的重点在 main()中。在这里你创建了一个 argparse.ArgumentParser()的实例,并给你的解析器起了一个名字。然后你添加两个参数, --infile和 --out。为了使用这个解析器,你需要调用 parse_args(),它将返回传递给你的程序的任何有效参数。最后,你要检查用户是否使用了 --infile 标志。如果他们使用了,那么你就运行 file_parser()。

下面是你如何在你的终端中运行代码。

$ python file_parser.py --infile something.txt Processing something.txt Finished processing

在这里,你用 --infile标志和一个文件名来运行你的脚本。这将运行 main(),然后调用 file_parser()。

下一步是使用你在代码中声明的两个命令行参数尝试运行你的应用程序。

$ python file_parser.py --infile something.txt --out output.txt Processing something.txt Finished processing Creating output.txt

这一次,你得到了一个额外的输出行,提到了输出文件名。这代表你的代码逻辑中的一个分支。当你指定一个输出文件时,你可以让你的代码通过使用一个新的代码块或一个函数来生成该文件。如果你不指定一个输出文件,那么那个代码块就不会运行。

当你使用argparse创建你的命令行工具时,你可以很容易地添加信息,当你的用户不确定如何正确地与你的程序互动时,可以帮助他们。

现在是时候找出如何从你的应用程序中获得帮助了

创建帮助信息

argparse库将使用你在创建每个参数时提供的信息,自动为你的应用程序创建一个有用的信息。这里是代码:

# file_parser.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser('File parser') parser.add_argument('--infile', help='Input file') parser.add_argument('--out', help='Output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

现在试着用 -h标志运行这段代码,你应该看到以下内容。

$ file_parser.py -h usage: File parser [-h] [--infile INFILE] [--out OUT] optional arguments: -h, --help show this help message and exit --infile INFILEInput file --out OUTOutput file

add_argument()的帮助参数被用来创建上面的帮助信息。argparse会自动添加 -h和 -help选项。你可以通过给它一个描述和后记来使你的帮助信息更丰富。

让我们用它们来改进你的帮助信息。首先,把上面的代码复制到一个新的文件中,命名为 file_parser_with_description.py,然后把它修改成下面的样子。

# file_parser_with_description.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser( 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', ) parser.add_argument('--infile', help='Input file for conversion') parser.add_argument('--out', help='Converted output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

在这里,把description和epilog参数传递给ArgumentParser。还更新了 add_argument()的帮助参数,使其更具描述性。

在做了这些修改之后,当你用 -h或 --help运行这个脚本时,你会看到以下输出。

$ python file_parser_with_description.py -h usage: File parser [-h] [--infile INFILE] [--out OUT] PyParse - The File Processor optional arguments: -h, --help show this help message and exit --infile INFILEInput file for conversion --out OUTConverted output file Thank you for choosing PyParse!

现在可以在你的帮助输出中看到新的description 和epilog。这给了你的命令行程序一些额外的修饰。

你也可以通过ArgumentParser的 add_help参数在你的应用程序中完全禁用帮助。如果你认为你的帮助文本过于冗长,你可以像这样禁用它。

# file_parser_no_help.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser( 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', add_help=False, ) parser.add_argument('--infile', help='Input file for conversion') parser.add_argument('--out', help='Converted output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

通过将 add_help设置为 False,你将禁用 -h和 --help标志。

你可以看到下面的演示。

$ python file_parser_no_help.py --help usage: File parser [--infile INFILE] [--out OUT] File parser: error: unrecognized arguments: --help

在下一节中,你将学习如何为你的参数添加别名!

添加别名

别名是一个花哨的词,指的是使用一个替代的标志来做同样的事情。例如,你知道你可以使用 -h和 --help来访问程序的帮助信息。-h是 --help的别名,反之亦然。

看看 main()里面的 parser.add_argument()方法有什么变化。

# file_parser_aliases.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser( 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', add_help=False, ) parser.add_argument('-i', '--infile', help='Input file for conversion') parser.add_argument('-o', '--out', help='Converted output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

这里你改变了第一个 add_argument(),除了接受 -infile之外,还接受了 -i,你还在第二个 add_argument()中加入了 -o。这样就可以使用两个新的快捷标志来运行你的代码。

下面是一个例子。

$ python3 file_parser_aliases.py -i something.txt -o output.txt Processing something.txt Finished processing Creating output.txt

如果你去看argparse文档,你会发现也可以给子解析器添加别名。子解析器是一种在你的应用程序中创建子命令的方法,这样它就可以做其他事情。一个很好的例子是Docker,一个虚拟化或容器应用程序。它有一系列的命令,你可以在docker下运行,以及docker compose等等。这些命令中的每一个都有独立的子命令,你都可以使用。

下面是一个典型的docker命令,用于运行一个容器。

docker exec -it container_name bash

这将用docker启动一个容器。而如果你要使用docker compose,你将使用一组不同的命令。exec和compose是subparsers的例子。

使用相互排斥的参数

有时你需要让你的应用程序接受一些参数,但不接受其他参数。例如,你可能想限制你的应用程序,使它只能创建或删除文件,而不是同时创建和删除。

argparse模块提供了 add_mutually_exclusive_group()方法,它就是这样做的。

将你的两个参数添加到一个组对象中,使其相互排斥,如下面的例子。

# file_parser_exclusive.py import argparse def file_parser(input_file, output_file=''): print(f'Processing {input_file}') print('Finished processing') if output_file: print(f'Creating {output_file}') def main(): parser = argparse.ArgumentParser( 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', add_help=False, ) group = parser.add_mutually_exclusive_group() group.add_argument('-i', '--infile', help='Input file for conversion') group.add_argument('-o', '--out', help='Converted output file') args = parser.parse_args() if args.infile: file_parser(args.infile, args.out) if __name__ == '__main__': main()

首先,你创建了一个相互排斥的组。然后,你把 -i和 -o参数添加到组中,而不是添加到解析器对象中。现在这两个参数是互斥的。

下面是当你试图用这两个参数运行你的代码时发生的情况。

$ python3 file_parser_exclusive.py -i something.txt -o output.txt usage: File parser [-i INFILE | -o OUT] File parser: error: argument -o/--out: not allowed with argument -i/--infile

用这两个参数运行你的代码,会使你的解析器向用户显示一条错误信息,解释他们做错了什么。

在涵盖了所有这些与使用argparse有关的信息之后,你已经准备好应用你的新技能来创建一个简单的搜索工具了

创建一个简单的搜索工具

在开始创建一个应用程序之前,弄清楚你要完成的任务总是好的。你在本节中想要建立的应用程序应该能够搜索特定文件类型的文件。为了使它更有趣,你可以添加一个额外的参数,让你也能选择性地搜索特定的文件大小。

你可以使用 Python 的 glob 模块来搜索文件类型。你可以在这里阅读关于这个模块的所有信息。

https://docs.python.org/3/library/glob.html

还有一个 fnmatch 模块,glob 自己也使用它。你现在应该使用 glob,因为它更容易使用,但是如果你有兴趣写一些更专业的东西,那么 fnmatch 可能是你正在寻找的。

然而,由于你希望能够通过文件大小来选择性地过滤返回的文件,你可以使用 pathlib,它包括一个类似 glob 的接口。glob 模块本身并不提供文件大小的信息。

你可以先创建一个名为 pysearch.py 的文件并输入以下代码。

# pysearch.py import argparse import pathlib def search_folder(path, extension, file_size=None): """ Search folder for files """ folder = pathlib.Path(path) files = list(folder.rglob(f'*.{extension}')) if not files: print(f'No files found with {extension=}') return if file_size is not None: files = [ f for f in files if f.stat().st_size >= file_size ] print(f'{len(files)} *.{extension} files found:') for file_path in files: print(file_path)

在上面的代码片段中,首先导入了argparse和pathlib。接下来,创建了search_folder()函数,它接收了三个参数。

  • path - 要搜索的文件夹

  • extension - 要寻找的文件扩展名

  • file_size - 要过滤的文件大小,以字节为单位。

把路径变成pathlib.Path对象,然后使用其rglob()方法在文件夹中搜索用户传入的扩展名。如果没有找到文件,就向用户打印一个有意义的信息,然后退出。

如果找到了任何文件,就检查是否已经设置了filesize。如果它被设置了,就用一个list comprehension来过滤出小于指定的filesize的文件。

接下来,打印出找到的文件的数量,最后在这些文件上循环,打印出它们的名字。

为了使这一切正常工作,需要创建一个命令行界面。你可以通过添加一个包含argparse代码的main()函数来做到这一点,像这样。

def main(): parser = argparse.ArgumentParser( 'PySearch', description='PySearch - The Python Powered File Searcher', ) parser.add_argument('-p', '--path', help='The path to search for files', required=True, dest='path') parser.add_argument('-e', '--ext', help='The extension to search for', required=True, dest='extension') parser.add_argument('-s', '--size', help='The file size to filter on in bytes', type=int, dest='size', default=None) args = parser.parse_args() search_folder(args.path, args.extension, args.size) if __name__ == '__main__': main()

这个ArgumentParser()有三个参数,与你传递给search_folder()的参数相对应。让--path和--ext参数成为必需的,而让--size参数成为可选的。注意,--size参数被设置为type=int,这意味着你不能把它传成字符串。

add_argument()函数有一个新的参数。它是dest参数,可以用它来告诉你的参数分析器在哪里保存传递给它们的参数。

下面是一个脚本运行的例子。

$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s 650 6 *.py files found: /Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases2.py /Users/michael/Dropbox/python101code/chapter32_argparse/pysearch.py /Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases.py /Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_with_description.py /Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_exclusive.py /Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_no_help.py

现在试试用-s和一个字符串来运行它。

$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s python usage: PySearch [-h] -p PATH -e EXTENSION [-s SIZE] PySearch: error: argument -s/--size: invalid int value: 'python'

这次我们收到了一个错误,因为-s和-size只接受整数。在你自己的机器上运行一下这段代码,看看当你使用-s和整数时,它是否按你想要的方式工作。

这里有一些想法,你可以用来改进你的代码版本。

更好地处理扩展文件。现在,它将接受 *.py,这不会像你期望的那样工作。

更新代码,以便你可以一次搜索多个扩展名

更新代码,以便对文件大小的范围进行过滤(例如,1MB-5MB)。

还有很多其他的功能和改进,你可以添加到这个代码中,比如添加错误处理或单元测试

到此,关于“如何用Python内置库创建一个命令行应用程序”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何用Python内置库创建一个命令行应用程序

本文链接: https://www.lsjlt.com/news/357801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何用Python内置库创建一个命令行应用程序
    这篇文章主要介绍“如何用Python内置库创建一个命令行应用程序”,在日常操作中,相信很多人在如何用Python内置库创建一个命令行应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python内置...
    99+
    2023-07-06
  • 利用Python内置库实现创建命令行应用程序
    目录介绍解析参数创建帮助信息添加别名使用相互排斥的参数创建一个简单的搜索工具总结介绍 当创建一个应用程序时,通常希望能够告诉你的应用程序如何做某事。有两种流行的方法来完成这项任务,你...
    99+
    2024-04-02
  • 如何创建一个Flex应用程序
    这篇文章主要介绍如何创建一个Flex应用程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Flex基础Flex是基于组件来进行开发的,为了更有效率地设计和开发Flex应用程序,你应该熟悉这些开发模式以及操作步骤。创建...
    99+
    2023-06-17
  • 如何使用Python创建第一个CGI程序
    本文小编为大家详细介绍“如何使用Python创建第一个CGI程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Python创建第一个CGI程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。第一个CGI程...
    99+
    2023-06-08
  • 如何在命令行中创建一个文件夹
    如何在命令行中创建一个文件夹?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。创建/删除文件夹1 键盘win+R,调出运行窗口,输入cmd打开2创建文件夹...
    99+
    2023-06-13
  • 如何使用Golang快速构建出命令行应用程序
    这篇文章主要介绍了如何使用Golang快速构建出命令行应用程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Golang快速构建出命令行应用程序文章都会有所收获,下面我们一起来看看吧。urfave/cl...
    99+
    2023-07-05
  • 用什么库写Python命令行程序
    这篇文章主要介绍“用什么库写Python命令行程序”,在日常操作中,相信很多人在用什么库写Python命令行程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”用什么库写Python命令行程序”的疑惑有所帮助!...
    99+
    2023-06-16
  • 使用Django怎么创建一个应用程序
    使用Django怎么创建一个应用程序?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。要在Django项目中创建基本应用,您需要转到包含manage.py的目录,然后从此处输入...
    99+
    2023-06-14
  • 如何创建并运行第一个C#程序
    C#是一种由微软公司开发的面向对象的编程语言,广泛应用于Windows桌面应用程序、Web应用程序、游戏开发、移动应用程序等领域。C#提供了丰富的类和命名空间,可以帮助开发人员快速构建高质量的应用程序。要创建并运行第一个 C#序,您需要完成...
    99+
    2023-10-22
    创建C#程序
  • Web应用程序如何使用C#进行创建
    本篇文章为大家展示了Web应用程序如何使用C#进行创建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用微软正在推行的.NET技术和C#语言可以快速建立Web应用程序,其安全性和可升级性都大大胜过普...
    99+
    2023-05-31
    c# web应用程序
  • Python 中如何通过 shell 命令运行 Django 应用程序?
    Django 是一个基于 Python 的 Web 框架,它提供了强大的工具和功能来帮助开发人员构建高效、灵活、可扩展的 Web 应用程序。在开发 Django 应用程序时,我们通常需要在命令行中执行一些操作,比如运行服务器、创建数据库、...
    99+
    2023-09-27
    关键字 shell django
  • 使用python怎么创建一个GUI程序
    本篇文章为大家展示了使用python怎么创建一个GUI程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-14
  • 怎么创建一个新的WinForm应用程序
    要创建一个新的WinForm应用程序,可以按照以下步骤进行: 打开Visual Studio开发环境 选择“新建项目”,然后选择“...
    99+
    2024-04-08
    winform
  • linux中如何使用useradd命令来创建一个新用户
    小编给大家分享一下linux中如何使用useradd命令来创建一个新用户,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一个新用户你可以使用 useradd 命令来创建一个新用户。使用超级用户或 root 权限运行 user...
    99+
    2023-06-16
  • C#中怎么创建一个Web应用程序
    这期内容当中小编将会给大家带来有关C#中怎么创建一个Web应用程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#创建Web应用程序项目在本节中,创建表示应用程序的用户界面的 Visual C# 或 V...
    99+
    2023-06-17
  • 如何使用Python打包文件框架创建一个独立的应用程序?
    好的,以下是文章内容: Python是一种流行的编程语言,它具有强大的库和框架,可以用于各种应用程序的开发。Python的一个强大特性是它可以使用打包文件框架来创建独立的应用程序,这样用户就可以轻松地运行程序,而不必安装Python或其他依...
    99+
    2023-06-22
    打包 文件 框架
  • 使用Golang快速构建出命令行应用程序
    目录urfave/clispf13/cobra在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工具,例如最...
    99+
    2023-02-24
    Golang命令行应用程序 Golang命令行
  • 利用Python创建第一个Django框架程序
    目录一.环境变量二.创建Django框架程序三.控制台四.实现Django的应用五.启动项目六.小结一.环境变量 右键我的电脑–>>属性–>...
    99+
    2024-04-02
  • 怎么创建一个简单的SpringBoot应用程序
    要创建一个简单的Spring Boot 应用程序,可以按照以下步骤操作: 使用 Spring Initializr 创建一个新的...
    99+
    2024-04-09
    SpringBoot
  • Django中怎么创建一个新的应用程序
    要在Django中创建一个新的应用程序,可以按照以下步骤进行操作: 使用以下命令创建一个新的Django应用程序: python...
    99+
    2024-03-05
    Django
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作