вызов pyowm работает в собственной программе, но не при вызове из другой программы

Библиотека 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(), она возвращает правильный ответ в первый раз, а затем НИКОГДА НЕ МЕНЯЕТ СВОИ ПРОГНОЗЫ.

См. например

#!/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, этот прогноз должен обновляться по мере изменения погоды, но это не так. Если прогноз «небольшой дождь» при первом запуске программы, он будет печатать «небольшой дождь» каждые десять секунд в течение неопределенного времени, без каких-либо изменений.

Я сделал ошибку в том, как второй бит кода вызывает первый? Есть ли какой-то кеш, который нужно сбросить? Что я могу здесь упустить?


person Michael Stern    schedule 18.08.2018    source источник


Ответы (1)


Ваш вызов 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']
person abarnert    schedule 18.08.2018
comment
А, это имеет смысл. Код вне функций запускается только один раз. Благодарю вас! - person Michael Stern; 18.08.2018
comment
@MichaelStern Несколько мыслей: 1) если вы будете запрашивать прогнозы каждые 10 секунд, вы, скорее всего, не получите никаких обновленных данных (я думаю, что API OWM меняет прогнозы погоды ежедневно или аналогично); 2) к вашему сведению, PyOWM поддерживает кэширование, но по умолчанию эта функция отключена (ссылка — pyowm.readthedocs.io/en/latest/) - person csparpa; 21.08.2018