我正在尝试在 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 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
因此,在我最近自学 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 用户),它就可以工作了。
希望这对某人有帮助。
我的解决方案是升级这些点
mongoengine
从 0.14.0
到 0.19.1
和
flask-mongoengine
至 0.9.5
成功了。
大多数主要软件包现在已经解决了这个问题,但一个主要软件包还没有解决,那就是 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
基本上,与模式相关的代码只会在第一次运行时失败,因此您首先需要运行一次并捕获它抛出的异常。
它对于我自己的脚本来说已经足够好了,但我不知道它是否解决了所有可能的问题。
理想情况下,有人应该分叉剪辑/模式项目,因为它不再维护。
他们解决了这个问题,只需卸载当前的
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
错误。
这应该在#577中修复: https://github.com/webpy/webpy/pull/577
正如问题标题所说,它提高了
RuntimeError
,而不是StopIteration
:
try:
yield ...
except RuntimeError:
... # Use return or break or pass (as applicable).
我在以下命令中遇到了同样的问题
python setup.py test
升级pytest版本时错误已解决
pip uninstall pytest
pip install pytest