从python控制台外部发送变量或从外部

时间:2016-07-05 06:53:54

标签: python

我编写了一个执行优化的Python脚本,并运行数天来获得解决方案(由于代价高昂的目标函数)。在所有日常工作中,只需在某个时刻停止计算就足够了,因为解决方案对我来说足够好(但不适用于优化算法)。

问题是,我总是可以中止按Ctrl + C.但是,没有机会很好地输出当前最佳参数,绘制数据,保存数据等。在下一次计算目标函数后以受控方式停止脚本会很棒。所以我的想法是如此问题一些变量(如果user_stop = True)并以编程方式停止优化。但是如何设置这样的变量呢? python控制台在执行期间被阻止。

我考虑过设置文本文件的内容并在每次迭代中读取它,但对于脚本的其他用户而言,这不仅很差而且难以解释。从理论上讲,我也可以要求用户输入,但脚本不会自动运行(直到某人决定停止为止)。

对我的问题有任何想法吗?

基本上就是这样 - 在某个时刻停止循环但执行打印:

a = 0
while True:
    a = a + 1
print(a)

3 个答案:

答案 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告诉您的程序退出。