如何用 Python 构建命令行天气应用

如何用 Python 构建命令行天气应用

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

本文介绍如何用 Python 和 Open-Meteo 免费 API 构建命令行天气应用:先通过地理编码 API 将城市名转换为经纬度,再请求当前温度和风速,使用 requests 解析 JSON,并用 sys 处理命令行参数、优雅处理错误。作者建议先实现基础版本,再逐步添加湿度、预报等功能,并强调亲手重写代码才能真正掌握 API 调用。

🔎

延伸解读

地理编码:城市名转经纬度的关键步骤

文章使用 Open-Meteo 的免费地理编码 API 将城市名转换为经纬度,这是调用天气 API 的前提。代码中通过 count=1 只取第一个匹配结果,作者提醒同名城市可能有多处,因此结果未必是用户期望的地点。读者在实际使用时应留意这一局限,或后续增加多结果选择功能。

错误处理:让命令行工具更健壮

示例代码对网络请求异常和 JSON 解析错误分别做了捕获,并在地理编码无结果时返回 None,避免程序崩溃。这种分层处理让工具在断网或输入错误城市时仍能给出友好提示。读者可借鉴这种模式,在调用其他 API 时也加入超时和异常捕获,提升脚本的可靠性。

从基础版到功能扩展的渐进路径

作者建议先实现当前温度和风速的基础版本,再逐步添加湿度、短期预报、多城市选择等功能。每次只做一个小改进,避免一次性堆砌功能导致混乱。这种迭代方式适合初学者巩固 API 调用、字典操作和错误处理等核心技能,也便于定位问题。

亲手重写:真正掌握 API 调用的关键

文章强调,看懂代码不等于掌握,建议读者在理解示例后关闭页面,从零重写整个应用。过程中难免遗忘或遇到报错,但正是排查和修复的过程能加深对 HTTP 请求、JSON 解析和命令行参数的理解。掌握这一模式后,可尝试用同样的思路对接其他类型的 API。

❓

Q&A

如何用 Python 将城市名转换为经纬度?

使用 Open-Meteo 的免费地理编码 API。发送 GET 请求到 https://geocoding-api.open-meteo.com/v1/search,参数包括 name(城市名)和 count=1,然后从返回的 JSON 中提取 results[0] 的 latitude 和 longitude。如果无结果则返回 None。

怎样用 Python 获取指定经纬度的当前天气数据?

向 Open-Meteo 的天气 API 发送请求:https://api.open-meteo.com/v1/forecast,参数包括 latitude、longitude 和 current=temperature_2m,wind_speed_10m。解析 JSON 后返回 data['current'] 即可得到当前温度和风速。

如何让 Python 脚本从命令行接收城市名参数?

使用 sys 模块。sys.argv 列表包含命令行参数,sys.argv[0] 是脚本名,sys.argv[1:] 是传入的参数。可以用 ' '.join(sys.argv[1:]) 来支持带空格的城市名(如 New York)。

在天气应用中如何优雅地处理网络请求错误?

使用 try-except 捕获 requests.exceptions.RequestException 来处理网络连接问题,并捕获 KeyError 和 ValueError 来处理数据解析错误。同时,在请求中设置 timeout 参数(如 timeout=5)避免长时间等待。

构建这个命令行天气应用需要安装哪些库?

只需要安装 requests 库,用于发送 HTTP 请求。可以通过 pip install requests 安装。其他如 sys 是 Python 标准库,无需额外安装。

这个天气应用可以进一步添加哪些功能?

可以添加湿度(使用 relative_humidity_2m 参数)、显示短期预报、让用户从多个匹配城市中选择、以及美化输出格式。建议每次只添加一个小功能,逐步完善。

为什么作者建议在完成基础版本后要自己从头重写代码?

因为复制粘贴代码无法真正掌握知识,自己重写时会遇到错误并需要调试,这个过程能加深理解,真正学会 API 调用和错误处理。

🏷️

标签

➡️

继续阅读