2010-06-11 5 views
2

J'ai une application écrite en python. Je veux donner à mes utilisateurs la possibilité de manipuler les objets des applications en leur permettant d'exécuter leurs propres scripts. Ils sont susceptibles de faire des erreurs dans leurs scripts. S'il y a une erreur je veux m'assurer que l'application n'arrête pas de fonctionner. J'aimerais intégrer un débogueur dans mon application pour les aider à déboguer leurs scripts.Python en tant que script d'utilisateur final dans une application python

par exemple. Je défini une classe de points dans mon application à shapes.py:

class QVPoint(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
    def addPoint(self, aPoint): 
     self.x = self.x + aPoint.x 
     self.y = self.y + aPoint.y 

Je veux leur permettre d'exécuter des scripts comme:

from shapes import QVPoint 
a = QVPoint(1,1) 
a.addPoint(QVPoint(2,2)) 
print "<" + str(a.x) + ',' + str(a.y) + ">" 
print "<%d,%d>" % (a.x, a.y) 
print 'done' 

Je figure cela doit utiliser l'interpréteur, le débogueur mais je Je ne suis pas sûr de deux choses, 1) comment exposer les objets qui sont créés dans l'application au script, et 2) comment s'assurer que l'application ne s'arrête pas si un bug provoque l'arrêt du script.

Je suis sûr que cela doit avoir été demandé auparavant, mais je ne peux pas le trouver. Toutes les réponses sont les bienvenues

Beaucoup thx

David

+0

Formatez votre code s'il vous plaît. – alternative

+0

Juste pour clarifier je veux partager l'état de l'application avec le script. Un sous-processus impliquerait l'élaboration d'un protocole pour communiquer les changements d'état de l'application et serait très lent. La seule chose qui pourrait être nécessaire sur un thread séparé serait un débogueur à l'occasion - même si je pourrais être en mesure d'utiliser un débogueur distant. – DangerMouse

+0

Je pense que ma solution sera d'utiliser compile() et eval() enveloppé par try: except. en utilisant les globales d'un module vide appelé sandbox. – DangerMouse

Répondre

3

Je vous suggère d'utiliser une instance d'interprète séparé (python séparé) pour évaluer les scripts de l'utilisateur. Cela garantira que tout ce qui casse dans le script utilisateur n'affectera jamais votre application. Vous pouvez exécuter des processus externes en utilisant le module os, ce serait une façon de le faire: http://docs.python.org/library/os.html#os.popen

Vous pouvez autoriser les scripts utilisateur à importer certains modules de votre application afin que les variables que vous définissez soient accessibles par les scripts.

+0

Juste une note que 'subprocess' est recommandé sur' os' pour démarrer les processus externes. –

+0

Vrai, désolé pour cela, le sous-processus est un meilleur choix. –

1

Il y a quelques décisions à prendre.

  1. Voulez-vous l'exécuter dans le même processus de votre application ou dans un processus distinct?

    Sans connaître beaucoup de détails de votre application, j'aurais tendance à préférer les exécuter dans un processus séparé. Utilisez le module subprocess pour cela. Vous pouvez créer un lanceur d'applications qui appelle à son tour le script de vos utilisateurs. S'il déclenche une exception, vous pouvez l'attraper et formater le résultat et le rapporter à l'utilisateur.

  2. Souhaitez-vous exposer les classes à votre utilisateur ou les objets à votre utilisateur?

    Dans votre exemple, il semble que le partage des classes soit suffisant. Cela devrait être assez simple.

    Si ce ne sont que des classes, vous pouvez simplement l'inclure dans le PYTHONPATH. Ensuite, votre utilisateur peut simplement les importer. Si vous souhaitez exposer un objet, cela peut vous obliger à le faire en cours. Sinon, vous devez trouver un moyen de sérialiser vos objets et de les transférer dans le nouveau processus.

+0

Juste pour clarifier, je cherche à partager des objets ainsi que des classes. Si j'utilise un sous-processus, j'ai besoin de créer des proxies et des stubs pour communiquer entre les deux processus - ce qui semble plus de travail que nécessaire. Cela signifie également que toute personne qui veut étendre l'application doit écrire des procurations et des talons, ce qui n'est certainement pas souhaitable. – DangerMouse