在下面的简单示例中,我有一个函数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")
如果我提前停止训练过程,我想保存当前的模型权重。
答案 0 :(得分:2)
在您的示例中,a
是foo()
的本地。您需要将其设为全局,或者您希望在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
不确定这样做有多大意义,但为了说明。您也可以使用全局变量,但我不喜欢在大多数情况下推荐它。