我编写了一个执行优化的Python脚本,并运行数天来获得解决方案(由于代价高昂的目标函数)。在所有日常工作中,只需在某个时刻停止计算就足够了,因为解决方案对我来说足够好(但不适用于优化算法)。
问题是,我总是可以中止按Ctrl + C.但是,没有机会很好地输出当前最佳参数,绘制数据,保存数据等。在下一次计算目标函数后以受控方式停止脚本会很棒。所以我的想法是如此问题一些变量(如果user_stop = True)并以编程方式停止优化。但是如何设置这样的变量呢? python控制台在执行期间被阻止。
我考虑过设置文本文件的内容并在每次迭代中读取它,但对于脚本的其他用户而言,这不仅很差而且难以解释。从理论上讲,我也可以要求用户输入,但脚本不会自动运行(直到某人决定停止为止)。
对我的问题有任何想法吗?
基本上就是这样 - 在某个时刻停止循环但执行打印:
a = 0
while True:
a = a + 1
print(a)
答案 0 :(得分:0)
也许你可以使用do-while循环。把你的目标控制在变量中 在循环之外并开始循环计算,同时< =您的目标计算。
答案 1 :(得分:0)
对于Windows,我会使用msvcrt.getch()
例如,此脚本将循环直到按下某个键,然后,如果它是q
,则提示用户退出:(请注意if
语句使用'short circuiting'当我们知道某个键被按下时,只评估getch()
- 阻塞 - 。
import msvcrt, time
while True: #This is your optimization loop
if msvcrt.kbhit() and msvcrt.getch() == 'q':
retval = raw_input('Quit? (Y/N) >')
if retval.lower() == 'y':
print 'Quitting'
break #Or set a flag...
else:
time.sleep(1)
print('Processing...')
如果将此if
块放在优化循环中经常运行的位置,它将允许您在方便的位置进行索引,或者至少设置一个可以在以下位置检查的标记每次优化运行结束。
如果您无法将其放置在经常检查的位置,那么您可以查看处理Ctrl-C引发的KeyboardInterrupt
如果您在Linux上运行,或者需要跨平台功能,请查看获取按键的this答案。
答案 2 :(得分:0)
如果您不经常轮询“变量”(最多每20秒一次),那么测试文件的开销可以忽略不计。像
这样的东西import os
QUITFILE = "/home/myscript/quit_now.txt"
# and for convenience, delete any old QUITFILE that may exist at init time
... # days later
if os.path.isfile( QUITFILE)
# tidy up, delete QUITFILE, and exit
然后只需echo please > home/myscript/quit_now.txt
告诉您的程序退出。