Question

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

Cependant, je ne peux pas comprendre comment envoyer des arguments de script. Je me rends compte que je pourrais simplement créer une variable avec une liste d'arguments, mais il doit y avoir une manière appropriée de le faire. De plus, le faire en utilisant la méthode 'Python' appropriée me permet de compiler les scripts et d'utiliser un générateur de document automatisé appelé Sphinx. Le but ultime est donc de pouvoir utiliser:

import sys
sys.argv

Dans l'un de mes scripts, demandez-lui de récupérer les arguments spécifiés par l'utilisateur (via l'application C #).

Pour le 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é de rechercher une API pour ajouter des arguments de script sans succès. J'ai également essayé de les ajouter au chemin du script (_path dans l'exemple) sans succès. J'ai essayé avec CreateScriptSourceFrom File et CreateScriptSourceFromSting (ce qui était un long plan de toute façon ...).

Est-ce que ce que j'essaie de faire est possible?

Était-ce utile?

La solution

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 implémente ICollection<string>.

Autres conseils

sys.argv va éventuellement renvoyer les paramètres réels transmis à l’application d’hébergement. Voici quelques solutions pour résoudre ce problème:

  1. Réécrivez votre script pour accepter les variables globales, puis utilisez ScriptScope.SetVariable
  2. Exécutez le script, mais comptez sur lui pour vous renvoyer une classe sur laquelle vous pouvez invoquer des méthodes (beaucoup plus facile en 4.0 avec un mot clé dynamique)
  3. écrasez sys.argv avec votre propre implémentation (c'est un langage dynamique après tout!)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top