Pregunta

Tengo un motor de secuencias de comandos integrado en mi aplicación C# que usa IronPython 2.Creo el tiempo de ejecución de Python y agrego algunas clases al espacio de nombres global para que el script pueda importarlas como módulos.

Sin embargo, una cosa (bastante básica) que no puedo entender es cómo enviar argumentos de script.Me doy cuenta de que podría simplemente crear una variable con una lista de argumentos, pero debe haber una forma adecuada de hacerlo.Además, hacerlo en la forma adecuada 'Python' me permite compilar los scripts y utilizar un generador de documentos automatizado llamado Sphinx.Entonces el objetivo final es poder utilizar:

import sys
sys.argv

En uno de mis scripts y hago que obtenga los argumentos que especificó el usuario (a través de la aplicación C#).

Ahora mismo, llamo al script usando:

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

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

E intenté buscar una API para agregar argumentos de script sin suerte.También intenté agregarlos a la ruta del script (_path en el ejemplo) sin suerte.Probé con CreateScriptSourceFrom File y CreateScriptSourceFromSting (que de todos modos era una posibilidad remota...).

¿Es posible lo que estoy tratando de hacer?

¿Fue útil?

Solución

Cuando crea el motor, puede agregar un " Argumentos " La opción contiene sus argumentos:

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

Ahora sys.argv contendrá ["foo", "bar"].

Puede configurar options["Arguments"] a cualquier cosa que implemente ICollection<string>.

Otros consejos

sys.argv eventualmente devolverá los parámetros reales pasados ​​a la aplicación de alojamiento.A continuación se muestran algunas formas de resolver esto:

  1. Vuelva a escribir su script para aceptar variables globales, luego use ScriptScope.SetVariable
  2. Ejecute el script, pero confíe en él para que le devuelva una clase, en la que pueda invocar métodos (mucho más fácil en 4.0 con palabra clave dinámica)
  3. Anule sys.argv con su propia implementación (¡después de todo, este es un lenguaje dinámico!)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top