原文:
www.kdnuggets.com/build-a-command-line-app-with-python-in-7-easy-steps
作者提供的图片
构建简单项目是学习 Python 和任何编程语言的绝佳方式。你可以学习写 for 循环的语法、使用内置函数、读取文件等等。但是,只有当你开始构建某些东西时,你才会真正“学习”。
采用“通过构建学习”的方法,让我们编码一个可以在命令行中运行的简单待办事项应用程序。在此过程中,我们将探索诸如解析命令行参数、处理文件和文件路径等概念。我们还将重新审视定义自定义函数等基础知识。
所以让我们开始吧!
通过跟随本教程进行编码,你将能够构建一个可以在命令行中运行的待办事项应用程序。好吧,那么你希望这个应用程序具备什么功能呢?
像纸上的待办事项列表一样,你需要能够添加任务、查看所有任务,并在完成后删除任务(是的,在纸上划掉或标记完成)。所以我们将构建一个可以实现以下功能的应用程序。
将任务添加到列表中:
作者提供的图片
获取列表中所有任务的清单:
作者提供的图片
以及在完成后使用索引删除任务:
作者提供的图片
现在让我们开始编码吧!
首先,为你的项目创建一个目录。在项目目录中,创建一个 Python 脚本文件。这将是我们的待办事项列表应用程序的主要文件。我们称之为 todo.py
。
这个项目不需要任何第三方库。因此,只需确保你使用的是最新版本的 Python。本教程使用 Python 3.11。
在 todo.py
文件中,首先导入所需的模块。对于我们的简单待办事项列表应用程序,我们需要以下模块:
所以让我们导入这两个模块:
import argparse
import os
请记住,我们将使用命令行标志来添加、列出和删除任务。对于每个参数,我们可以使用短选项和长选项。对于我们的应用程序,使用如下选项:
-
-a
或--add
用于添加任务 -
-l
或--list
用于列出所有任务 -
-r
或--remove
用于通过索引删除任务
这里我们将使用 argparse 模块来解析在命令行提供的参数。我们定义了create_parser()
函数,完成以下操作:
-
初始化一个
ArgumentParser
对象(我们称之为parser
)。 -
为添加、列出和删除任务添加参数,通过在解析器对象上调用
add_argument()
方法。
添加参数时,我们添加了短选项和长选项以及相应的帮助信息。所以这是create_parser()
函数:
def create_parser():
parser = argparse.ArgumentParser(description="Command-line Todo List App")
parser.add_argument("-a", "--add", metavar="", help="Add a new task")
parser.add_argument("-l", "--list", action="store_true", help="List all tasks")
parser.add_argument("-r", "--remove", metavar="", help="Remove a task by index")
return parser
我们现在需要定义函数来执行以下任务管理操作:
-
添加任务
-
列出所有任务
-
根据索引移除任务
以下函数add_task
与一个简单的文本文件交互,以管理 TO-DO 列表中的项目。它以‘追加’模式打开文件,并将任务添加到列表末尾:
def add_task(task):
with open("tasks.txt", "a") as file:
file.write(task + "\n")
注意我们如何使用with
语句来管理文件。这样可以确保文件在操作后关闭——即使发生错误——从而最小化资源泄漏。
要了解更多信息,请阅读本教程中的上下文管理器章节,以高效处理资源。
list_tasks
函数通过检查文件是否存在来列出所有任务。文件仅在你添加第一个任务时创建。我们首先检查文件是否存在,然后读取并打印任务。如果当前没有任务,我们会得到一条有用的信息:
def list_tasks():
if os.path.exists("tasks.txt"):
with open("tasks.txt", "r") as file:
tasks = file.readlines()
for index, task in enumerate(tasks, start=1):
print(f"{index}. {task.strip()}")
else:
print("No tasks found.")
我们还实现了一个remove_task
函数来根据索引删除任务。以‘写入’模式打开文件会覆盖现有文件。所以我们删除对应索引的任务,并将更新后的 TO-DO 列表写入文件:
def remove_task(index):
if os.path.exists("tasks.txt"):
with open("tasks.txt", "r") as file:
tasks = file.readlines()
with open("tasks.txt", "w") as file:
for i, task in enumerate(tasks, start=1):
if i != index:
file.write(task)
print("Task removed successfully.")
else:
print("No tasks found.")
我们已经设置了解析器来解析命令行参数。同时,我们也定义了执行添加、列出和删除任务的函数。那么接下来是什么?
你可能已经猜到了。我们只需根据接收到的命令行参数调用正确的函数。让我们定义一个main()
函数,使用我们在第 3 步创建的ArgumentParser
对象来解析命令行参数。
根据提供的参数,调用相应的任务管理函数。这可以通过一个简单的 if-elif-else 梯形结构来完成,如下所示:
def main():
parser = create_parser()
args = parser.parse_args()
if args.add:
add_task(args.add)
elif args.list:
list_tasks()
elif args.remove:
remove_task(int(args.remove))
else:
parser.print_help()
if __name__ == "__main__":
main()
你现在可以从命令行运行 TO-DO 列表应用程序。使用短选项h
或长选项help
来获取使用信息:
$ python3 todo.py --help
usage: todo.py [-h] [-a] [-l] [-r]
Command-line Todo List App
options:
-h, --help show this help message and exit
-a , --add Add a new task
-l, --list List all tasks
-r , --remove Remove a task by index
起初,列表中没有任务,因此使用--list
列出所有任务时会打印“未找到任务。”:
$ python3 todo.py --list
No tasks found.
现在我们可以这样向 TO-DO 列表中添加一项:
$ python3 todo.py -a "Walk 2 miles"
当你现在列出项目时,你应该能看到添加的任务:
$ python3 todo.py --list
1\. Walk 2 miles
由于我们添加了第一个项目,tasks.txt 文件已被创建(请参阅第 4 步中list_tasks
函数的定义):
$ ls
tasks.txt todo.py
让我们在列表中再添加一个任务:
$ python3 todo.py -a "Grab evening coffee!"
还有一个:
$ python3 todo.py -a "Buy groceries"
现在让我们获取所有任务的列表:
$ python3 todo.py -l
1\. Walk 2 miles
2\. Grab evening coffee!
3\. Buy groceries
现在让我们按索引删除一个任务。假设我们完成了晚间咖啡(希望今天就此结束),所以按如下方式将其删除:
$ python3 todo.py -r 2
Task removed successfully.
修改后的待办事项列表如下:
$ python3 todo.py --list
1\. Walk 2 miles
2\. Buy groceries
好的,我们的应用程序的最简单版本已经准备好了。那么如何进一步发展呢?这里有几个你可以尝试的事项:
-
当你使用无效的命令行选项(比如
-w
或--wrong
)时会发生什么?默认行为(如果你记得 if-elif-else 结构)是打印帮助信息,但也会有异常。尝试使用 try-except 块实现错误处理。 -
通过定义包括边界情况的测试用例来测试你的应用程序。你可以首先使用内置的 unittest 模块。
-
通过添加一个选项来指定每个任务的优先级来改进现有版本。还可以尝试按优先级对任务进行排序和检索。
在本教程中,我们构建了一个简单的命令行待办事项列表应用程序。在此过程中,我们学会了如何使用内置的 argparse 模块解析命令行参数。我们还使用命令行输入在后台对简单的文本文件执行相应操作。
那么,我们接下来该做什么呢?好吧,像 Typer 这样的 Python 库使构建命令行应用程序变得轻而易举。我们将在即将到来的 Python 教程中使用 Typer 构建一个。在此之前,继续编程吧!
Bala Priya C**** 是来自印度的开发者和技术写作者。她喜欢在数学、编程、数据科学和内容创作的交汇处工作。她的兴趣和专长包括 DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编程和喝咖啡!目前,她正在通过编写教程、操作指南、评论文章等与开发者社区分享她的知识。Bala 还创建引人入胜的资源概述和编码教程。
1. 谷歌网络安全证书 - 快速进入网络安全职业道路
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织进行 IT 工作