2009-07-06 13 views
2

Par exemple, dans Lua, vous pouvez placer la ligne suivante à la fin d'un script:Est-il possible de renvoyer un objet ou une valeur d'un script Python à l'application d'hébergement?

return <some-value/object> 

La valeur/objet qui est retourné peut alors être récupéré par l'application d'hébergement.

J'utilise ce modèle pour que les scripts puissent représenter des usines pour les gestionnaires d'événements. Les gestionnaires d'événements basés sur un script sont ensuite utilisés pour étendre l'application. Par exemple, l'application d'hébergement exécute un script appelé 'SomeEventHandler.lua' qui définit et retourne un objet qui est un gestionnaire d'événement pour 'SomeEvent' dans votre application.

Est-ce que cela peut être fait en Python? Ou y a-t-il un meilleur moyen d'y parvenir? Plus précisément, j'intègre IronPython dans mon application C# et je cherche un moyen d'utiliser ces gestionnaires d'événements basés sur des scripts, ce qui permettra à l'application d'être étendue en utilisant Python.

Répondre

2

C'est totalement possible et une technique courante lors de l'intégration de Python. This article montre les bases, comme le fait this page. La fonction principale est PyObject_CallObject() qui appelle le code écrit en Python, à partir de C.

3

Cela peut être fait de la même manière en Python. Vous pouvez exiger que le plug-in pour fournir une fonction/méthode getHandler() qui retourne le gestionnaire d'événements:

class myPlugin(object): 

    def doIt(self,event,*args): 
    print "Doing important stuff" 

    def getHandler(self,document): 
    print "Initializing plugin" 
    self._doc = document 
    return doIt 

Lorsque l'utilisateur dit « Je veux utiliser le plugin X maintenant, » vous savez qui fonctionnent à appeler. Si le plugin doit non seulement être appelé après une commande directe, mais aussi sur certains événements (comme par exemple le chargement d'un élément graphique), vous pouvez également fournir à l'auteur du plugin des possibilités de lier le gestionnaire à cet événement.

+0

Comment référence ne vous la fonction? La chose que j'aime vraiment dans Lua à propos du retour d'un objet du script est que l'objet est complètement anonyme. Vous n'avez pas besoin d'avoir un nom de classe ou un nom de variable globale sur lequel le script et l'application d'hébergement doivent s'entendre. –

+3

Un script python (c'est-à-dire un module) ne peut pas renvoyer un objet. Donc, vous devez vous mettre d'accord sur une convention d'interface, que ce soit "le script du plugin doit laisser exactement un objet dans l'espace de noms, et ceci doit être une instance de MyApplicationPlugin" ou fournir une fonction d'un nom particulier. – balpha

1

La façon dont je le ferais (et la façon dont je l'ai vu) est d'avoir une fonction pour chaque événement emballé dans un module (ou sur plusieurs, peu importe), puis appeler la fonction par C/C++/C# et utilisez sa valeur de retour.

2

Voir quelques exemples dans Embedding the Dynamic Language Runtime.

Un exemple simple, setting-and-fetching-variables:

SourceCodeKind st = SourceCodeKind.Statements; 
string source = "print 'Hello World'"; 
script = eng.CreateScriptSourceFromString(source, st); 
scope = eng.CreateScope(); 
script.Execute(scope); 
// The namespace holds the variables that the code creates in the process of executing it. 
int value = 3; 
scope.SetVariable("name", value); 

script.Execute(scope); 

int result = scope.GetVariable<int>("name"); 
Questions connexes