【问题标题】:"RuntimeError: generator raised StopIteration" every time I try to run app每次我尝试运行应用程序时都会出现“RuntimeError:生成器引发 StopIteration”
【发布时间】:2019-01-13 00:28:24
【问题描述】:

我正在尝试运行此代码:

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(experimental),但仍然无法正常工作。

【问题讨论】:

  • Python 3.7 循环现在更难了,需要更深入地了解 python(生成器)的内部结构。 Java for-each 现在比 python 更容易了。

标签: python python-3.x runtime-error python-3.7 stopiteration


【解决方案1】:

从文件路径判断,您运行的似乎是 Python 3.7。如果是这样,你会被new-in-3.7 behavior 抓住:

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 方应用程序未针对 PEP 479 进行修复,您是 SOL 吗?
  • 当然,除非他们更改了应用程序,否则升级应用程序不会产生影响。如果他们没有,你可以自己修补它。或者在你关心的应用程序符合 PEP 479 之前不要迁移到 Python 3.7。由于我在野外看到的关于这方面的报告很少,我相信这是一个罕见的问题。
  • 太好了,谢谢。在 Python 3.7 不起作用时使用虚拟环境听起来是一个很好的解决方案。
  • 很抱歉问了一个菜鸟问题 - 这个解决方案有什么影响吗?为什么可以默默吞下异常?
  • @CozyAzure,阅读 PEP,这是您获得此更改的唯一理由。在此更改之前,StopIteration 被生成器默默吞噬,因为指定的原始生成器 PEP (255) 必须发生。所以建议的代码只是恢复了生成器多年来的行为。
【解决方案2】:

因此,在我最近自学 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】:

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

    mongoengine0.14.00.19.1

    flask-mongoengine0.9.5

    成功了。

    【讨论】:

    • 如何处理鸡蛋?
    【解决方案4】:

    他们修复了这个问题,只需卸载您当前的web.py 版本,我在从windows 10 运行pip install web.py 时遇到错误。所以我运行pip install -e git+https://github.com/webpy/webpy.git#egg=webpy 命令从master 分支获取最新版本。如问题所述,这不会执行RuntimeError: generator raised StopIteration 错误。

    【讨论】:

    • 我收到了警告,但这并没有解决问题。
    • WARNING: Generating metadata for package webpy produced metadata for project name web-py. Fix your #egg=webpy fragments.
    【解决方案5】:

    目前大多数主要软件包都已解决此问题,但尚未解决的主要软件包是clips/pattern project。它自 2018 年 8 月以来一直没有更新,因此从未得到修复。

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

    def pattern_stopiteration_workaround():
        try:
            print(lexeme('gave'))
        except:
            pass
    
    def main():
        pattern_stopiteration_workaround()
        #Add your other code here
    

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

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        python setup.py test
        

        升级pytest版本时错误解决

        pip uninstall pytest
        pip install pytest
        

        【讨论】:

          猜你喜欢
          • 2020-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多