← 返回蜂巢洞察

如何使用Python开发命令行天气应用

在完成了一些基础的Python项目之后,我开始对那些只是接收输入然后输出结果的程序感到有些厌倦了。我想做一些真正能够从互联网上获取数据的东西。 于是,我就制作了这个简单的天气应用。如果你觉得API还比较抽象,不用担心。只要记住,API其实就是让你的程序向另一个程序请求信息的一种方式而已。 这个应用的原理很简单:你在终端中输入一个城市名称,它就会显示该城市的当前温度和风速。虽然这个应用并不复杂,但它确实是一个帮助你熟悉API、HTTP请求以及命令行参数的好方法。 通过完成这个教程,你将学会如何发送HTTP请求、解析JSON数据、优雅地处理错误,以及如何编写可以在终端中使用的脚本。 我们将会涵盖的

在完成了一些基础的Python项目之后,我开始对那些只是接收输入然后输出结果的程序感到有些厌倦了。我想做一些真正能够从互联网上获取数据的东西。

于是,我就制作了这个简单的天气应用。如果你觉得API还比较抽象,不用担心。只要记住,API其实就是让你的程序向另一个程序请求信息的一种方式而已。

这个应用的原理很简单:你在终端中输入一个城市名称,它就会显示该城市的当前温度和风速。虽然这个应用并不复杂,但它确实是一个帮助你熟悉API、HTTP请求以及命令行参数的好方法。

通过完成这个教程,你将学会如何发送HTTP请求、解析JSON数据、优雅地处理错误,以及如何编写可以在终端中使用的脚本。

我们将会涵盖的内容:

开始使用前需要准备什么

在开始之前,请确保你已经具备了以下条件:

  • 已经安装了Python
  • 拥有一款代码编辑器(我使用的是VS Code)
  • 已经安装了requests库。

如果你还没有安装requests库,可以在终端中运行以下命令进行安装:

pip install requests

如何将城市名称转换为坐标

天气API通常需要的是纬度和经度,而不是城市名称。因此,我们首先需要一种方法来将“卡拉奇”或“纽约”这样的城市名称转换成对应的坐标。

Open-Meteo提供了一个免费的地理编码API,正好可以满足这个需求。以下是我使用的函数代码:

import requests

def get_coordinates(city_name):
    url = "https://geocoding-api.open-meteo.com/v1/search"

    params = {
        "name": city_name,
        "count": 1
    }

    response = requests.get(url, params=params, timeout=5)
    response.raise_for_status()

    data = response.json()

    if not data.get("results"):
        return None

    latitude = data["results"][0]["latitude"]
    longitude = data["results"][0]["longitude"]

    return latitude, longitude

这个函数的实现非常简单:我们只需要输入城市名称,然后获取相应的坐标信息即可。如果API没有找到任何结果,就会返回None,而不会导致程序崩溃。

需要提醒的一点是:有些城市名称在多个地方存在。因此,这段代码只会返回第一个匹配的结果,可能并不总是能得到你想要的信息。所以在将这段代码应用到你的项目中之前,请务必仔细检查一遍。

如何获取实时的天气数据

一旦我们得到了坐标,就可以查询天气信息了:

def get_weather(latitude, longitude):
    url = "https://api.open-meteo.com/v1/forecast"

    params = {
        "latitude": latitude,
        "longitude": longitude,
        "current": "temperature_2m,wind_speed_10m"
    }

    response = requests.get(url, params=params, timeout=5)
    response.raise_for_status()

    data = response.json()

    return data["current"]

“temperature_2m”和“wind_speed_10m”这两个参数分别用于查询距离地面2米处的温度以及10米高度处的风速。通过指定“current”这个参数,我们可以告诉API我们只需要当前时刻的天气数据,而不是多日的预报信息。实际上,API还会返回很多其他数据,但我们这里只提取与当前天气相关的内容。

如何从终端运行该程序

我希望能像这样来运行这个程序:

python weather.py Karachi

因此,我使用了sys模块:

import sys

def main():
    if len(sys.argv) < 2:
        print("使用方法:python weather.py <城市名称>")
        return

    city = " ".join(sys.argv[1:])

    try:
        coordinates = get_coordinates(city)

        if not coordinates:
            print(f"未找到该城市:{city}")
            return

        latitude, longitude = coordinates
        weather = get_weather(latitude, longitude)

        print(f"\n{city}的天气情况")
        print(f"温度:{weather['temperature_2m']}°C")
        print(f>风速:{weather['wind_speed_10m']}公里/小时")

    except requests.exceptions.RequestException:
        print("无法连接到天气服务。请检查您的网络连接,然后重试。")

    except (KeyError, ValueError):
        print("在读取天气数据时出现了错误。")

if __name__ == "__main__":
    main()

sys模块使我们能够访问命令行参数。sys.argv包含了你在终端中输入的所有内容。sys.argv[0]是文件名(例如weather.py),而sys.argv[1]则是城市名称。使用" ".join(sys.argv[1:])这个方法,我们可以正确处理那些包含空格的城市名称,比如“New York”。

让我们来测试一下吧

将这个文件保存为weather.py,然后在相应的文件夹中打开终端,尝试运行以下命令:

python weather.py Madrid
python weather.py Paris
python weather.py Washington

如果你忘记输入城市名称,程序会告诉你正确的使用方法。

马德里的天气情况
温度:15.2°C
风速:8.4公里/小时

接下来我可能会添加什么功能

一旦基础版本能够正常运行,你还可以进行一些简单的升级操作:

  • 添加湿度信息(relative_humidity_2m)
  • 除了显示当前天气状况外,还添加短期天气预报
  • 当城市名称存在歧义时,允许用户从多个符合条件的城市中选择
  • 让输出结果看起来更美观一些

我通常会先选择一项小的改进功能,将其实现后再继续进行下一步。如果试图一次性完成所有修改,往往会弄得一团糟。

最后的思考

一旦你度过了“打印‘hello world’”这个初级阶段,想要构建真正能够与互联网交互的应用程序,这个项目就会变得非常有价值。通过这个项目,你可以获得关于函数、字典、错误处理以及API的实际使用经验,而这些知识以后会经常用到。

但有一点非常重要:一旦你让应用程序成功运行起来,就关闭这个页面,然后尝试从头开始重新构建整个系统。

你会忘记一些细节,也可能会遇到一些奇怪的错误,从而浪费一段时间去解决它们。这没关系——恰恰正是这样的过程才能真正帮助你学到东西。直接复制我的代码并不能让你真正掌握这些知识,而自己想办法解决遇到的问题,才会让你真正理解其中的原理。

在让天气应用程序正常运行之后,可以尝试用完全不同的API采用同样的方法进行开发(比如电影信息、加密货币价格、体育比赛结果等等)。其实操作步骤基本上是相同的:先让基础版本能够运行起来,然后再尝试对其进行修改和优化。

相关文章

技术实践

如何将应用程序从AWS迁移到GKE [完整指南]

这个指导性实验将带你了解如何迁移一个小型支付应用。该应用包含使用React开发的用户界面以及运行在AWS EC2实例上的Express API,而数据库则仍保存在AWS上。 你需要将用户界面和API迁移到Google Kubernetes Engine上,但无需更改客户目前使用的公共URL地址,而是逐步将流量从AWS转移至GKE,每次转移的比例为几百分比。 完成整个迁移过程后,你将能够在本地运行该应用,在AWS上搭建基础设施,通过八个Terraform步骤在GKE上构建环境,测试新环境是否正常工作,然后将生产环境的流量全部转移到GKE上,完成切换流程,并拆除不再需要的资源。 下图展示了迁移过程

阅读全文
技术实践

API漏洞的“工程学分析”:深入探讨OWASP列出的十大最常见API安全风险

大多数安全文章读起来都像威胁报告。它们从外部角度描述各种漏洞:攻击者会采取什么行动、这些漏洞会造成什么影响,以及全球范围内有多少系统会受到影响。这样的信息确实很有参考价值,但它们并不能帮助工程师构建更安全的系统。 但这篇文章有所不同。它从内部角度分析OWASP API安全十大漏洞中的每一个:是哪些工程决策导致了这些漏洞的出现,违反了哪些架构原则,以及应该采取什么样的工程标准才能防止这类漏洞被应用到生产环境中。 我在受监管的金融环境中从事过多年大规模生产级应用程序的开发工作。这份列表中提到的漏洞并非理论上的概念,我在实际系统中见过其中的大部分。有些漏洞在我将其投入生产之前就发现了;而有些则在我开

阅读全文
技术实践

如何向英国税务海关总署的“数字化纳税”API提交季度更新报告

每年有四次,所有参与“税收数字化”计划的个体经营者和房东都必须向英国税务海关总署提交一份收入与支出的汇总报表。 2026-27纳税年度的第一个截止日期是8月7日,这个期限已经过去;第二个截止日期则是11月7日。每份汇总报表都需要通过软件向英国税务海关总署发送一次API请求,而本教程正是专门讲解如何正确完成这些请求操作的。 您无需事先阅读任何其他资料即可跟随本教程进行操作。每次进行“税收数字化”集成时所需的一次性设置信息(包括沙箱应用程序、OAuth 2.0访问令牌以及防欺诈相关配置)已在下方的简要总结中列出,同时每段代码示例中也都会使用到一些辅助函数。 如果您想深入了解这些设置步骤,我曾在 之

阅读全文