可以在其他脚本中调用的Python atexit模块替代方案

0 投票
2 回答
1830 浏览
提问于 2025-04-16 03:51

使用 atexit.register(function) 来注册一个函数,这个函数会在你的 Python 脚本结束时被调用,这是一个很常见的做法。

但是,我发现一个情况,这种做法会出现问题:如果你的脚本是通过另一个 Python 脚本使用 execfile() 执行的。

在这种情况下,你会发现 Python 在脚本结束时找不到你注册的函数,这其实是有道理的。

我想知道如何保持这个功能,同时避免这个问题。

2 个回答

0

这个方法对我有效。我创建了一个文件,准备让另一个文件来执行它,文件名是 a.py

$ cat a.py 
import atexit

@atexit.register
def myexit():
    print 'myexit in a.py'

然后我创建了 b.py 来调用 execfile:

$ cat b.py 
import atexit

@atexit.register
def b_myexit():
    print 'b_myexit in b.py'

execfile('a.py')

当我运行 b.py 的时候,两个注册的函数都会被调用:

$ python b.py 
myexit in a.py
b_myexit in b.py

注意,当我运行这两个脚本的时候,它们是在同一个文件夹里的。如果你的 a.py 在一个不同的文件夹,就像 Ryan Ginstrom 在他的回答中提到的那样,你需要使用它的完整路径,比如:

execfile('/path/to/a.py')
0

我觉得你遇到的问题可能是因为当前工作目录的位置不对。你可以通过以下方式来确保你指定了正确的位置:

import os

target = os.path.join(os.path.dirname(__file__), "mytarget.py")

撰写回答