Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结束无限while循环_Python_While Loop_Infinite Loop - Fatal编程技术网

Python 结束无限while循环

Python 结束无限while循环,python,while-loop,infinite-loop,Python,While Loop,Infinite Loop,我目前的代码基本上运行一个无限while循环来收集用户的数据。根据文本文件的内容不断更新词典/列表。供参考: while (True): IDs2=UpdatePoints(value,IDs2) time.sleep(10) 基本上,我的问题是我不知道什么时候结束,但在while循环运行之后,我希望使用收集的信息,而不是因为程序崩溃而丢失它。有没有一种简单、优雅的方法可以随时退出while循环?像在我的键盘上按某个键这样的操作会很棒。您可以尝试将该代码包装在try/excep

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

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

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

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

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

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

我认为最简单的解决方案是捕获循环的时间,并使用它来确定何时停止循环

except KeyboardInterrupt:
    break

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

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

这就是我建议发出信号的原因:

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

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

代码说明:

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


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

我使用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循环无效,允许脚本完成数据保存协议,而不会使整个脚本突然停止

希望这有帮助


我建议使用
try,但如果在Google Colab或Jupyter中的IPYNB文件上运行,则循环中的
语法除外,如:

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

之外的最后一个
用于任何其他错误,如果发生,循环将继续

您可以捕获Python中的
键盘中断
错误:

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

while True:
使用它看起来更专业:

while 1>0:
要了解有关Python错误处理的更多信息(请尝试、例外等),请执行以下操作:

或:


CTRL+BREAK是超级中断键,至少在Windows上是这样。我必须说,这是我见过的try/except块最简洁的用法之一。我可能会尝试此模式进行调试。尝试。。。除了积木不仅仅用于“不应该发生的事情”。事实上,(请求原谅比请求允许更容易)@dopatraman我已经更新了Python 3兼容性的答案。请立即尝试。请注意,根据您使用的IDE,Ctrl+C将不起作用。例如,PyDev不支持它。要测试这一点,请在普通控制台中运行该程序。当try-except没有运行时,这对我有效。不知道为什么,恐怕我没有时间调查。@WillC也许这有帮助:try-except只定义了一种方法,一旦键盘中断成功,它就可以处理键盘中断。但是程序仍然可以阻塞,并且不注册中断信号。这就是信号处理程序有用的地方:当相应的信号到达时,处理程序将直接执行,而不管您的程序是否在某些C代码中阻塞/循环。(例如,昂贵的regex.match调用)