0

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

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

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

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

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

plt.plot(i,calculated_data)

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

4

1 回答 1

1

你试过了吗

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

编辑:您也许可以使用异步信号,尤其是在 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 终止程序并恢复外部循环。您可以从终端或另一个读取用户输入并向os.kill()计算进程发送信号的 python 程序执行此操作。

于 2017-08-17T16:01:52.933 回答