2009-10-22 8 views
0

L'utilisateur entre un script python dans un éditeur python Java GUI et peut l'exécuter depuis l'éditeur. Y at-il un moyen de prendre le script de l'utilisateur et d'imposer une limite de temps sur le script total?Comment imposer une limite de temps pour un script entier en Python

Je suis familier avec comment cela fonctionne avec fonctions/signal.alarm (mais je suis sur Windows & unix Jython) mais la seule solution que j'ai trouvé est de mettre ce script dans une méthode dans un autre script où J'utilise la fonction setTrace() mais cela supprime la "fonctionnalité" que la valeur des variables globales en elle persistent. c'est à dire.

try: 
i+=1 
except NameError: 
i=0 

La valeur de 'i' est incrémentée de 1 à chaque exécution.

Répondre

4

Utilisez un threading.Timer pour exécuter une fonction dans un thread séparé après un délai défini (la durée maximale que vous voulez pour votre programme), et que l'utilisation de la fonction thread.interrupt_main (note qu'il est dans le module thread, pas dans le module threading!) pour lever une exception KeyboardInterrupt dans le thread principal. Une approche plus solide (dans le cas où le script est coincé dans un code non-interruptible non-Python, afin qu'il ignore les interruptions du clavier) est d'engendrer un "processus de surveillance" pour tuer le script errant très fort si nécessaire (faites cela ainsi que l'approche ci-dessus, et un peu plus tard que le retard que vous utilisez ci-dessus, pour donner au script une chance d'exécuter ses destructeurs, fonctions atexit, etc, si possible).

+0

merci! Je ne suis pas un utilisateur python avancé, mais je vais essayer de le faire fonctionner. – Leonidas

+0

ah J'utilise Jython 2.1 donc thread.interrupt_main() ne fonctionne pas! – Leonidas

+0

@Leonidas, je ne sais pas avec certitude comment un thread Java ou Jython peut mieux interrompre (proprement, c'est-à-dire, avec tous les finaliseurs et essayer/enfin, etc.) tout le processus. Qu'en est-il de java.lang.System.exit (1) ...? –

0

Ceci est juste une supposition, mais peut-être envelopper avec Threading ou Multiprocessing? Avoir un fil de minuterie qui le tue quand il expire.