You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用python_weather模块的聊天机器人无天气输出问题求助

使用python_weather模块的聊天机器人无天气输出问题求助

看起来你的聊天机器人遇到了几个关键问题,导致触发天气/温度查询时没有任何输出,我帮你梳理下可能的原因和修复方案:

1. 输入匹配逻辑的问题(最可能的核心原因)

你的代码里用了task in weather_cmds和task in temp_qs来判断用户输入,但这要求用户输入完全精确匹配数组里的字符串(包括大小写、标点、空格),比如用户输入"what's the weather?"或者少了个问号,就会匹配失败,根本不会进入对应的分支,自然没有输出。

另外,在温度查询的分支里,你写了:

if task in temp_qs[0] or task in temp_qs[3]:

这个逻辑完全搞反了!task in temp_qs[0]是判断用户输入的字符串是不是temp_qs[0]的子串,而不是判断用户输入的是不是这两个预设问题之一。比如用户输入完整的"What is the temperature today?",这个判断会返回False,因为整个字符串并不是子串,而且你已经在elif task in temp_qs里做了外层判断,这个嵌套判断完全多余。

修复方案:
改成模糊匹配逻辑,先把用户输入统一预处理,再通过关键词判断,不用局限于预设的固定句子:

# 预处理用户输入:转小写、去掉首尾空格、移除问号
task_processed = task.strip().lower().replace('?', '')

# 天气查询判断:包含weather关键词即可
if 'weather' in task_processed:
    location = input("Enter country: ")
    tracemalloc.start()
    print(asyncio.run(get_weather_forecast(location)))
    tracemalloc.stop()
# 温度查询判断:包含temperature/hot/cold关键词即可
elif 'temperature' in task_processed or 'hot' in task_processed or 'cold' in task_processed:
    location = input("Enter country: ")
    tracemalloc.start()
    print(asyncio.run(get_current_temp(location)))
    tracemalloc.stop()
else:
    print("Sorry, I don't understand that request.")

这样用户输入类似"what's the weather today?"或者"is it hot outside?"都能触发对应的逻辑,不用严格匹配预设句子。

2. get_current_temp函数缺少异常处理

你的get_weather_forecast函数有捕获BadApiKeyError和NotFoundError,但get_current_temp完全没有异常处理。如果用户输入的地点不存在,或者API密钥有问题,这个函数会直接抛出异常,但因为asyncio.run没有被try-except包裹,可能异常被静默处理了(或者程序直接崩溃但没输出错误信息)。

修复方案:给get_current_temp加上完整的异常处理:

async def get_current_temp(location):
    async with python_weather.Client() as client:
        try:
            weather = await client.get(location)
            return f"The temperature is {weather.current.temperature}°C in {location}."
        except python_weather.exceptions.BadApiKeyError:
            return "API key is invalid."
        except python_weather.exceptions.NotFoundError:
            return f"Could not find weather information for {location}."
        except Exception as e:
            return f"An error occurred: {str(e)}"

加上兜底的Exception捕获,能确保任何错误都有返回信息,不会静默失败。

3. python_weather模块的API密钥配置问题

现在python_weather默认使用OpenWeatherMap的API,必须配置有效的API密钥才能正常请求数据。如果没有配置密钥,请求大概率会失败,即便有异常处理,也可能因为未覆盖的网络错误导致无输出。

修复方案:初始化Client时传入你的API密钥:

# 在getweather模块里,创建Client时指定API密钥
async with python_weather.Client(api_key="你的OpenWeatherMap密钥") as client:

你需要先去OpenWeatherMap平台注册获取免费的API密钥,再替换上面的字符串。

4. 快速调试建议

如果还是有问题,可以在每个分支开头加调试打印,确认程序是否进入了对应的逻辑:

if 'weather' in task_processed:
    print("已进入天气查询分支")  # 调试用,确认匹配成功
    location = input("Enter country: ")
    # ... 其他代码

这样能快速定位是输入匹配的问题,还是后续的API请求问题。


备注:内容来源于stack exchange,提问作者Minion123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 16:04:33