【问题标题】:Ending an infinite while loop结束无限的while循环
【发布时间】:2013-09-30 10:54:19
【问题描述】:

我目前的代码基本上运行一个无限的 while 循环来收集用户的数据。根据文本文件的内容不断更新字典/列表。供参考:

while (True):
    IDs2=UpdatePoints(value,IDs2)
    time.sleep(10)

基本上,我的问题是我不知道我想要什么时候结束,但是在这个 while 循环运行之后,我想使用收集到的信息,而不是因为我的程序崩溃而丢失它。有没有一种简单、优雅的方法可以随时退出 while 循环?像在我的键盘上按下某个键这样的东西会很棒。

【问题讨论】:

    标签: python while-loop infinite-loop


    【解决方案1】:

    您可以在 Python 中捕获 KeyboardInterrupt 错误:

    try:
        while 1>0:
            IDs2=UpdatePoints(value,IDs2)
            time.sleep(10)
    except KeyboardInterrupt:
        print('While loop ended!')
    

    另外,不要说:

    while True:
    

    使用起来看起来更专业:

    while 1>0:
    

    了解更多关于 Python 错误处理(try、except 等)的信息:

    https://www.w3schools.com/python/python_try_except.asp

    或:

    https://www.w3schools.com/python/gloss_python_try_finally.asp

    【讨论】:

      【解决方案2】:

      如果您在 Google Colab 或 Jupyter 中的 IPYNB 文件上运行,我建议在循环中使用 try, except 语法,例如:

      while True:
          try:
             IDs2=UpdatePoints(value,IDs2)
             time.sleep(10)
          except KeyboardInterrupt:
             break
          except:
             continue
      

      最后一个except 是针对任何其他错误,如果发生循环将恢复

      【讨论】:

        【解决方案3】:

        我使用 python 来跟踪股票价格并在我的投资组合中提交自动买入/卖出命令。长话短说,我希望我的跟踪程序 ping 数据服务器以获取信息,并根据收集到的信息进行交易,但我还想保存股票数据以供将来参考,除了能够启动/停止程序随时随地。

        最终对我有用的是:

        trigger = True
        while trigger == True:
         try:
          (tracking program and purchasing program conditions here)
         except:
          trigger = False
        
        print('shutdown initialized')
        df = pd.DataFrame...
        save all the datas
        print('shutdown complete')
        

        等等

        从这里开始,当程序处于永远循环中,向我的代理 API 发送数据请求时,使用 CTRL-C 键盘中断函数将异常切换为try 循环,它使 while 循环无效,允许脚本完成数据保存协议,而不会使整个脚本突然停止。

        希望这会有所帮助!

        Resultant

        【讨论】:

          【解决方案4】:

          您可以尝试将该代码包装在 try/except 块中,因为键盘中断只是例外:

          try:
              while True:
                  IDs2=UpdatePoints(value,IDs2)
                  time.sleep(10)
          except KeyboardInterrupt:
              print('interrupted!')
          

          然后你可以用CTRL-C退出循环。

          【讨论】:

          • 我不得不说,这是我见过的 try/except 块的更简洁的用途之一。我可能会尝试这种模式进行调试。
          • try... except... 块不仅用于“不应该发生的事情”。事实上,"Python generally recommends the EAFP policy"(请求原谅比请求许可更容易)
          • @dopatraman 我已经更新了 Python 3 兼容性的答案。请立即尝试。
          • 请注意,根据您使用的 IDE,Ctrl+C 将不起作用。例如 PyDev 不支持它。要对此进行测试,请在普通控制台中运行程序。
          【解决方案5】:

          您可以使用例外。但是你应该只对不应该发生的事情使用例外。所以不是为了这个。

          这就是我推荐信号的原因:

          import sys, signal
          def signal_handler(signal, frame):
              print("\nprogram exiting gracefully")
              sys.exit(0)
          
          signal.signal(signal.SIGINT, signal_handler)
          

          你应该把它放在程序的开头,当你在程序的任何地方按 ctrl+c 时,它都会优雅地关闭

          代码说明:

          您导入 syssignals。 然后你创建一个在退出时执行的函数。 sys.exit(0) 以退出代码 0 停止编程(代码表示一切正常)。

          当程序通过 ctrl-c 或终端中的 kill 命令获取 SIGINT 时,您的程序将正常关闭。

          【讨论】:

          • 当 try-except 没有时,这对我有用。不知道为什么,恐怕我没有时间调查。
          • @WillC 也许这有帮助:try-except 只定义了一种处理 KeyboardInterrupt 的方法,一旦它设法实际中断程序。但是程序仍然可以阻塞并且没有注册您的中断信号。这就是信号处理程序有用的地方:当相应的信号到达时,无论您的程序在某些 C 代码中阻塞/循环,都直接执行处理程序。 (例如昂贵的 regex.match 调用)
          【解决方案6】:

          我认为最简单的解决方案是在interrupt key is pressed 时捕获KeyboardInterrupt,并使用它来确定何时停止循环。

          except KeyboardInterrupt:
              break
          

          寻找这个异常的缺点是它可能会阻止用户在循环仍在运行时终止程序。

          【讨论】:

          • CTRL+BREAK 是超级中断键,至少在 Windows 上是这样。
          猜你喜欢
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 1970-01-01
          • 2015-06-25
          • 2014-03-29
          • 2014-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多