python - 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,因此该预测应该会随着天气的变化而更新,但事实并非如此。如果程序第一次运行时预报是“小雨”,它将无限期地每十秒打印一次“小雨”,永远不会改变。
我在第二段代码调用第一段代码的方式上犯了错误吗?是否有一些缓存需要刷新?我可能在这里缺少什么?
解决方案
您的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']
推荐阅读
- antd - 像完整的日历一样自定义 Antd 日历?
- r - 带有输入文本和输出文本的简单闪亮应用
- c++ - C++ 每天重置雨量计数器
- c# - 从派生类获取基类受保护的属性
- android - React Native 构建失败无法 HEAD /android-jsc/maven-metadata.xml'
- authentication - 如何在 Jmeter 中获取用于登录的 csrf 令牌
- flutter - 如果我不能 100% 确定 Flutter 应用程序的安全性,我应该发布它吗?
- python - UTC 日期时间问题 - 如何适合冒号 - 时间数据“2021-03-11 09:30:01-05:00”与格式“%Y%m%d %H:%M:%S %z”不匹配'
- typescript - 是否可以根据泛型类型定义泛型函数?
- python - 如何使用 Kivy 正确读取图像像素?