2010-09-08 13 views
0

L'utilisation de atexit.register(function) pour enregistrer une fonction à appeler lorsque votre script Python se termine est une pratique courante.Alternative au module python atexit qui fonctionne lorsqu'il est appelé à partir d'autres scripts

Le problème est que j'ai identifié un cas où cela échoue d'une manière laide: si votre script il exécuté à partir d'un autre script python en utilisant le execfile().

Dans ce cas, vous découvrirez que Python ne sera pas en mesure de localiser votre fonction quand elle se termine, et c'est logique.

Ma question est comment garder cette fonctionnalité d'une manière qui ne présente pas ce problème.

+0

Pouvez-vous fournir plus de détails? Un échantillon qui échoue? Comme @bstpierre montre qu'il semble bien fonctionner. –

Répondre

0

Je pense que le problème que vous rencontrez est avec l'emplacement du répertoire de travail actuel. Vous pouvez vous assurer que vous spécifiez l'emplacement correct en faisant quelque chose comme ceci:

import os 

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

Cela fonctionne pour moi. J'ai créé un fichier à exécuter par un autre fichier, a.py:

$ cat a.py 
import atexit 

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

Et puis b.py pour appeler execfile:

$ cat b.py 
import atexit 

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

execfile('a.py') 

Quand je lance b.py, les deux fonctions enregistrées s'appellent:

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

Notez que ces deux scripts se trouvent dans le même répertoire lorsque je les ai exécutés. Si votre a.py est dans un répertoire distinct comme Ryan Ginstrom mentionné dans sa réponse, vous devez utiliser le chemin d'accès complet, comme:

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