У меня есть модуль, который пользователи будут импортировать, а затем доступ к методам в интерактивном режиме (выучен здесь ), который они будут запускать на Raspberry Pi с Raspbian Jessie.
Метод A использует atexit
:
Когда выход из python через exit()
, выполняются последние шаги (о чем свидетельствует сохранение файла токена) Но если я закрываю окно терминала , они не выполняются.
> from module import A
> a = A(7)
> a.sqrx()
'hey, x^2 = 49'
> exit()
Метод B использует context manager
, который я выучил здесь :
Он немедленно выполняет последние шаги , хотя экземпляр все еще остается доступным для интерактивной работы.
> from module import B
> with B(4) as b:
> b.sqrx()
hello, I am B
hello, __enter__
'hey, x^2 = 16'
hello, __exit__
> b.sqrx()
'hey, x^2 = 16'
Ни то, что я хотел бы , то есть сохранить объект доступным для интерактивной работы, но выполнить последние шаги, если я выйду из python через exit()
или если я случайно закрою окно терминала и закройте приложение терминала.
Есть ли способ сделать все это?
Вот абстрагированный модуль:
import atexit
class A(object):
def __init__(self, x, start_it=False):
self.x = int(x)
atexit.register(self.stop)
print 'hello, I am A'
def sqrx(self):
return "hey, x^2 = {}".format(self.x**2)
def stop(self):
fname = 'stop_{}.txt'.format(self.x)
with open (fname, 'w') as outfile:
outfile.writelines(['stop!\n', self.sqrx()])
class B(object):
def __init__(self, x, start_it=False):
self.x = int(x)
print 'hello, I am B'
def sqrx(self):
return "hey, x^2 = {}".format(self.x**2)
def stop(self):
fname = 'stop_{}.txt'.format(self.x)
with open (fname, 'w') as outfile:
outfile.writelines(['stop!\n', self.sqrx()])
def __enter__(self):
print 'hello, __enter__'
return self
def __exit__(self, type, value, traceback):
self.stop()