首页 > 解决方案 > pyowm 调用在自己的程序中有效,但在从其他程序调用时无效

问题描述

该库允许人们从https://openweathermap.orgpyowm获取天气预报。它在我为下载近期预测而编写的一个小程序中运行良好(见下文,除了我的 API 密钥,我已经 X 了;插入你自己的 API 密钥,你想测试代码,他们'可从 openweathermap 免费获取)。

#!/usr/bin/env python
import pyowm
import json

owm = pyowm.OWM('XXXXXXXXXXXXX')  # You MUST provide a valid API key

forecaster = owm.three_hours_forecast('Santa Fe, US')
forecast = forecaster.get_forecast()
forecastJSON=json.loads(forecast.to_JSON())

def oneForecast():
    mrForecast = forecastJSON['weathers'][:1]
    return mrForecast[0]['detailed_status']

def printForecast():
    print oneForecast()

if __name__ == "__main__":
    printForecast()

这可以从命令行完美运行。但是,如果我创建另一个定期调用 oneForecast() 的程序,它会第一次返回正确答案,然后永远不会更改其预测。

参见例如

#!/usr/bin/env python

import time
import msForecast

def run():
    while True:
        text = msForecast.oneForecast()
        print text
        time.sleep(10.0)

if __name__ == "__main__":
    run_text = run()

该程序从命令行运行时,应该每十秒打印一次简单的预测。由于它每次都会调用 API,因此该预测应该会随着天气的变化而更新,但事实并非如此。如果程序第一次运行时预报是“小雨”,它将无限期地每十秒打印一次“小雨”,永远不会改变。

我在第二段代码调用第一段代码的方式上犯了错误吗?是否有一些缓存需要刷新?我可能在这里缺少什么?

标签: pythonfunctionweather-api

解决方案


您的oneForecast调用不会做任何事情来获取新的预测,它只是格式化您之前已经获取的预测。

这是获取新预测的代码:

forecaster = owm.three_hours_forecast('Santa Fe, US')
forecast = forecaster.get_forecast()

那是顶级模块代码:它只在每个 Python 解释器会话中运行一次,当您第import一个模块时。

因此,您只需要在每次调用时重写代码以执行该 fetch 操作oneForecast,可能是这样的:

forecaster = owm.three_hours_forecast('Santa Fe, US')

def oneForecast():
    forecast = forecaster.get_forecast()
    forecastJSON=json.loads(forecast.to_JSON())
    mrForecast = forecastJSON['weathers'][:1]
    return mrForecast[0]['detailed_status']

推荐阅读