Python:使用控件停止Skript而不会丢失数据

时间:2017-08-17 15:46:58

标签: python database user-controls spyder experimental-design

我有一个python科学脚本,用于计算循环中运行的某种传热和流动动力学。每次通过循环时,它都会打印出一些有关脚本状态的信息。有了这些数据,我可以看到它在运行时是否是可行的模拟,或者有时在某个时刻它是不可行的。

问题是,如何在不丢失数据的情况下停止脚本?因为在整个模拟结束时我将打印出一些图表等但我不想运行脚本直到最后,当我已经看到。所以我需要的是一些用户中断,比如ctrl + c。我想到了try-catch这个键盘用户中断,然后转到模拟结束以绘制图表等。

顺便说一下,我在Spyder工作。

感谢任何建议或更复杂的解决方案,这里有一些代码示例:

while i<10000:
    calculated_data = i + i
    print(calculated_data)

plt.plot(i,calculated_data)

所以通常我需要10k运行,但是当我看到i = 500时,它变得不可行,但是不想要松散的计算数据(calculated_data),我想以某种方式中断用户。但我也不想每个步骤都询问用户。

1 个答案:

答案 0 :(得分:1)

你试过吗

try:
    while i<10000:
        calculated_data = i + i
        print(calculated_data)
except KeyboardInterrupt:
    save_me(calculated_data)
    raise

编辑:您可以使用asynchronous signal,尤其是在unix环境中,例如

was_interrupted = False

def receive_signal(signum, stack):
    global was_interrupted
    was_interrupted = True

signal.signal(signal.SIGUSR1, receive_signal)

for s in range(max_simulation):
    params = next_parameterset()
    while i < 10000:
        calculated_data = i + 1
        print(calculated_data)
        if was_interrupted:
            save_me(params, calculated_data)
            was_interrupted = False
            break

因此,当您看到内部循环需要被中断时,您使用SIGUSR1终止程序并恢复外部循环。您可以从终端或其他读取用户输入的python程序执行此操作,并将os.kill()信号发送到计算过程。