pyowm 调用在自己的程序中有效,但在从其他程序调用时无效

pyowm call works in own program, but not when called from other program

pyowm 库允许从 https://openweathermap.org 获取天气预报。它在我编写的一个下载近期预测的小程序中运行良好(见下文,除了我的 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() 的程序,它会 returns 第一次给出正确答案,然后永远不会更改其预测。

例子见

#!/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,因此该预报应该会随着天气的变化而更新,但事实并非如此。如果在程序第一个 运行 时预测为 'light rain',它将无限期地每十秒打印一次 'light rain',永远不会改变。

我是不是在第二段代码调用第一段代码的方式上出错了?是否有一些缓存需要刷新?我可能在这里遗漏了什么?

您的 oneForecast 调用不会执行任何获取新预测的操作,它只是格式化您之前获取的预测。

这是获取新预测的代码:

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

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

因此,您只需重写代码即可在每次调用 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']