如果获得异常则打印函数变量 - KeyboardInterrupt

时间:2016-04-20 13:31:40

标签: python python-2.7 exception exception-handling try-catch

在下面的简单示例中,我有一个函数foo()做某事。函数内部有一个变量a。我想要做的是当程序捕获KeyboardInterrupt时,可以打印本地函数变量a

显然,以下方式无效。无论如何可以做到这一点吗?

def foo():
    a = 1
    for _ in xrange(10000):
        a += 1
    return a

try:
    a = foo()
except KeyboardInterrupt:
    print a

更新(回答以下关于我为什么要使用Control-C的评论)

实际上,我的目的是提前停止我的Keras RNN训练过程。如下代码:

from keras.models import Sequential

def train():
    model = Sequential()
    ....
    model.build()
    ....
    for iteration in range(1, 200):
        ....
        model.fit(X_train, y_train, ...)
        ....
    ....


if __name__ == '__main__':
    try:
        model = train()
    except KeyboardInterrupt:
        model.save_weights("weights.hdf5")

如果我提前停止训练过程,我想保存当前的模型权重。

3 个答案:

答案 0 :(得分:2)

在您的示例中,afoo()的本地。您需要将其设为全局,或者您希望在foo()内添加异常捕获。这是后者的一个例子

def foo():
    try:
        a = 1
        for _ in xrange(10000):
            a += 1
        return a
    except KeyboardInterrupt:
        print a

答案 1 :(得分:2)

您只需要在model函数之外创建train ,然后将model作为参数传递给train。这样,如果您在返回之前使用 Ctrl-C 中断model,则会有train的有效引用。

例如,

from keras.models import Sequential

def train(model):
    model.build()
    ....
    for iteration in range(1, 200):
        ....
        model.fit(X_train, y_train, ...)
        ....
    ....


if __name__ == '__main__':
    try:
        model = Sequential()
        train(model)
    except KeyboardInterrupt:
        model.save_weights("weights.hdf5")

答案 2 :(得分:0)

由于foo()永远不会完成,因此永远不会分配。您需要分解您的功能,以便呼叫者在任何给定时间知道它的最后一个值。

def foo(a):
   return a + 1

try:
    for _ in xrange(10000):
        a = foo(a)
except KeyboardInterrupt:
    print a

不确定这样做有多大意义,但为了说明。您也可以使用全局变量,但我不喜欢在大多数情况下推荐它。