2010-09-08 5 views
0

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

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

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

Мой вопрос заключается в том, как сохранить эту функциональность таким образом, чтобы эта проблема не возникала.

+0

Можете ли вы предоставить более подробную информацию? Образец, который терпит неудачу? Как показывает @bstpierre, это работает нормально. –

ответ

0

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

import os 

target = os.path.join(os.path.dirname(__file__), "mytarget.py") 
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 находится в отдельном каталоге, Райан Ginstrom говорил в своем ответе, вам нужно будет использовать полный путь к нему, как:

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