"RuntimeError: генератор поднял StopIteration" каждый раз, когда я пытаюсь запустить приложение

Я пытаюсь запустить этот код:

import web

urls = (
    '/', 'index'
)

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

Но это дает мне эту ошибку каждый раз

C:\Users\aidke\Desktop>python app.py
Traceback (most recent call last):
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\utils.py", line 526, in take
    yield next(seq)
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "app.py", line 14, in <module>
    app = web.application(urls, globals())
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\application.py", line 62, in __init__
    self.init_mapping(mapping)
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\application.py", line 130, in init_mapping
    self.mapping = list(utils.group(mapping, 2))
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\utils.py", line 531, in group
    x = list(take(seq, size))
RuntimeError: generator raised StopIteration

Я попробовал другой код, и то же самое произошло. Кроме того, я попытался переустановить web.py (экспериментальный), но он все еще не работал.

Ответы

Ответ 1

Судя по путям файлов, похоже, что вы используете Python 3.7. Если это так, вы попадаете в поведение, описанное здесь:

PEP 479 включен для всего кода в Python 3.7, что означает, что исключения StopIteration, возникающие прямо или косвенно в сопрограммах и генераторах, преобразуются в исключения RuntimeError. (Внесен Юрий Селиванов в bpo-32670.)

Перед этим изменением, StopIteration возникший или проходящий через генератор, просто закончил срок службы генератора (исключение было проглочено). Модуль, который вы используете, должен быть перекодирован для работы в соответствии с 3.7.

Скорее всего, они должны измениться:

yield next(seq)

чтобы:

try:
    yield next(seq)
except StopIteration:
    return

Ответ 2

Поэтому во время моего недавнего самообучения на Python курс потребовал, чтобы я установил Web.py, и я получил эту ошибку, и, как указано в одном из ответов, она должна была быть обновлена, чтобы быть совместимой с Python 3.7.

Я установил пакет с помощью pip3 install web.py==0.40-dev1 столкнулся с этой ошибкой и начал поиск решения в сети.

Я сделал поиск по webpy git и нашел файл utils.py, который был более свежим в https://github.com/webpy/webpy/tree/master/web, скачал его и использовал для замены того, который был в моей папке Lib/site-packages/web (я пользователь Windows), и это просто работает.

Надеюсь, это поможет кому-то.