当python退出终端关闭时,实例应执行最终指令;这些不起作用

时间:2019-01-07 04:44:31

标签: python python-2.7 raspbian exit

我有一个模块,用户可以导入该模块,然后交互地访问方法 (学习here),这些方法将在具有Raspbian Jessie的Raspberry Pi上运行。

方法A 使用atexit

当通过exit()退出python时,将执行最后的步骤(此处保存有令牌文件)但是如果我关闭终端窗口,则不会执行。

>
> from module import A
> a = A(7)
> a.sqrx()
  'hey, x^2 = 49'
> exit()

方法B 使用了我所学到的context managerhere

尽管实例仍可用于交互式工作,但它立即执行最后的步骤

> 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'

我也不想要,它是为了使对象可用于交互式工作,但是如果我通过exit()退出python或意外关闭了终端窗口,然后关闭终端应用程序。

有没有办法做所有这些事情?

这是抽象的模块:

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()

0 个答案:

没有答案