2009-10-21 9 views
4

J'ai un moteur de script intégré dans mon application C# qui utilise IronPython 2. Je crée l'environnement d'exécution Python et ajoute quelques classes à l'espace de noms global afin que le script puisse les importer en tant que modules.Arguments de script et Embedded IronPython

Cependant, une chose (assez basique) que je n'arrive pas à comprendre est de savoir comment envoyer des arguments de script. Je réalise que je pourrais juste créer une variable avec une liste d'arguments, mais il doit y avoir une bonne façon de le faire. De plus, le faire de la bonne façon en Python me permet de compiler les scripts et d'utiliser un générateur de documents automatisé appelé Sphinx. Donc, le but ultime est d'être en mesure d'utiliser:

import sys 
sys.argv 

Dans l'un de mes scripts et l'ont obtenir les arguments l'utilisateur spécifié (via l'application C#).

En ce moment, j'appelle le script en utilisant:

// set up iron python runtime engine 
_engine = Python.CreateEngine(); 
_runtime = _engine.Runtime; 
_scope = _engine.CreateScope(); 

// run script 
_script = _engine.CreateScriptSourceFromFile(_path); 
_script.Execute(_scope); 

et j'ai essayé la recherche d'une API pour ajouter des arguments de script avec pas de chance. J'ai aussi essayé de les ajouter au chemin du script (_path dans l'exemple) sans aucune chance. J'ai essayé avec CreateScriptSourceFrom File et CreateScriptSourceFromSting (qui était un long shot de toute façon ...).

Est-ce que j'essaie de faire même possible? Sys.argv va finir par retourner les paramètres réels passés dans l'application d'hébergement.

Répondre

6

Lorsque vous créez le moteur, vous pouvez ajouter un « Arguments » l'option contient vos arguments:

IDictionary<string, object> options = new Dictionary<string, object>(); 
options["Arguments"] = new [] { "foo", "bar" }; 
_engine = Python.CreateEngine(options); 

Maintenant, sys.argv contiendra ["foo", "bar"]. Vous pouvez définir options["Arguments"] sur tout ce qui met en œuvre ICollection<string>.

+0

Vous n'avez pas spécifié la version, mais cela pourrait nécessiter 2.6 - Je n'ai pas 2.0 à vérifier. –

+0

J'utilise 2.0.1 et ça marche. Merci! J'aime ce site. – cgyDeveloper

+0

Ah, je ne savais pas à ce sujet - bonne trouvaille! –

1

Voici quelques façons de résoudre ce:

  1. Ressaisissez votre script pour accepter des variables globales, utilisez ScriptScope.SetVariable
  2. Exécuter le script, mais compter sur elle pour vous rendre en fait une classe, que vous pouvez appeler des méthodes sur (beaucoup plus facile à 4.0 avec mot-clé dynamique)
  3. Override sys.argv avec votre propre mise en œuvre (ce qui est un langage dynamique après tout!)
+0

Hmmm ... Je pense que le # 3 sera le chemin à parcourir. Je suppose que je vais devoir exécuter 'import sys' et 'sys.argv = args' dans mon ScriptScope comme des instructions de C#? Puis 'import sys' et 'args = sys.argv' dans mon script fonctionneraient, oui? Je dois le faire de cette façon dans le script (importer sys quand sys existe) pour que Sphinx reconnaisse mes scripts comme Python valide et crée de la documentation. – cgyDeveloper