每次我尝试运行应用程序时“运行时错误:生成器引发 StopIteration”

问题描述 投票:0回答:8

我正在尝试在 Python 3.7 中运行此代码:

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(实验性)但它仍然不起作用。

python python-3.x iterator python-3.7 stopiteration
8个回答
138
投票

从文件路径判断,您似乎正在运行Python 3.7。如果是这样,您就会陷入 new-in-3.7 行为:

PEP 479 对 Python 3.7 中的所有代码启用,这意味着在协程和生成器中直接或间接引发的 StopIteration 异常将转换为 RuntimeError 异常。 (由 Yury Selivanov 在 bpo-32670 中贡献。)

在此更改之前,由发电机引发或通过发电机的

StopIteration
只是结束了发电机的使用寿命(异常被默默地吞噬)。您正在使用的模块必须重新编码才能按照 3.7 的预期工作。

他们可能需要改变:

yield next(seq)

至:

try:
    yield next(seq)
except StopIteration:
    return

3
投票

因此,在我最近自学 Python 期间,一门课程要求我安装 Web.py,我收到了此错误,正如答案之一所述,必须更新它才能与 Python 3.7 兼容。

我用

pip3 install web.py==0.40-dev1
安装了软件包,遇到了这个错误,并开始在网上搜索解决方案。

我所做的是通过 webpy git 搜索并找到 https://github.com/webpy/webpy/tree/master/web 中最新的 utils.py 文件,下载它并使用它替换我的 Lib/site-packages/web 文件夹中的那个(我是 Windows 用户),它就可以工作了。

希望这对某人有帮助。


3
投票

我的解决方案是升级这些点

mongoengine
0.14.0
0.19.1

flask-mongoengine
0.9.5

成功了。


2
投票

大多数主要软件包现在已经解决了这个问题,但一个主要软件包还没有解决,那就是 clips/pattern 项目。自 2018 年 8 月以来一直没有更新,因此从未收到修复。

由于这是“python 模式停止迭代”的最高 Google 结果,因此这里有一个解决方法:

def pattern_stopiteration_workaround():
    try:
        print(lexeme('gave'))
    except:
        pass

def main():
    pattern_stopiteration_workaround()
    #Add your other code here

基本上,与模式相关的代码只会在第一次运行时失败,因此您首先需要运行一次并捕获它抛出的异常。

它对于我自己的脚本来说已经足够好了,但我不知道它是否解决了所有可能的问题。

理想情况下,有人应该分叉剪辑/模式项目,因为它不再维护。


1
投票

他们解决了这个问题,只需卸载当前的

web.py
版本,我在从
pip install web.py
运行
windows 10
时遇到错误。因此,我运行
pip install -e git+https://github.com/webpy/webpy.git#egg=webpy
命令从
master
分支获取最新版本。这不会执行问题提到的
RuntimeError: generator raised StopIteration
错误。


0
投票

这应该在#577中修复: https://github.com/webpy/webpy/pull/577


0
投票

正如问题标题所说,它提高了

RuntimeError
,而不是
StopIteration

try:
    yield ...
except RuntimeError:
    ... # Use return or break or pass (as applicable).


-2
投票

我在以下命令中遇到了同样的问题

python setup.py test

升级pytest版本时错误已解决

pip uninstall pytest
pip install pytest
© www.soinside.com 2019 - 2024. All rights reserved.