Альтернатива модулю Python Atexit, который работает при вызове из других скриптов - PullRequest
0 голосов
/ 08 сентября 2010

Использование atexit.register(function) для регистрации функции, которая будет вызываться при выходе из вашего сценария Python, является обычной практикой.

Проблема в том, что я обнаружил случай, когда это терпит неудачу ужасным образом: если ваш скрипт этовыполняется из другого скрипта Python с использованием execfile().

. В этом случае вы обнаружите, что Python не сможет найти вашу функцию, когда он завершится, и это имеет смысл.

MyВопрос в том, как сохранить эту функциональность таким образом, чтобы это не создавало проблемы.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2010

Это работает для меня.Я создал файл для выполнения другим файлом, 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 находится в отдельном каталоге, как упоминал Райан Гинстром в своем ответе, вам нужно будет использовать полный путь к нему, например:

execfile('/path/to/a.py')
0 голосов
/ 08 сентября 2010

Я думаю, что у вас проблема с расположением текущего рабочего каталога. Вы можете убедиться, что вы указываете правильное местоположение, выполнив что-то вроде этого:

import os

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