Argumentos de script y IronPython integrado
-
05-07-2019 - |
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?
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:
- Vuelva a escribir su script para aceptar variables globales, luego use ScriptScope.SetVariable
- 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)
- Anule sys.argv con su propia implementación (¡después de todo, este es un lenguaje dinámico!)