Экземпляр должен выполнить последние инструкции, когда выход из python закрыт; это не работает - PullRequest
0 голосов
/ 07 января 2019

У меня есть модуль, который пользователи будут импортировать, а затем доступ к методам в интерактивном режиме (выучен здесь ), который они будут запускать на 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()
...