Domanda

Ho un motore di scripting incorporato nella mia applicazione C # che utilizza IronPython 2. Creo il runtime di Python e aggiungo alcune classi allo spazio dei nomi globale in modo che lo script possa importarli come moduli.

Tuttavia, una cosa (piuttosto semplice) che non riesco a capire è come inviare argomenti di script. Mi rendo conto che potrei semplicemente creare una variabile con un elenco di argomenti, ma ci deve essere un modo corretto per farlo. Inoltre, farlo nel modo corretto di 'Python' mi permette di compilare gli script e usare un generatore di documenti automatizzato chiamato Sphinx. Quindi l'obiettivo finale è quello di poter usare:

import sys
sys.argv

In uno dei miei script e ottenere gli argomenti specificati dall'utente (tramite l'app C #).

In questo momento, chiamo lo 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 ho provato a cercare un'API per aggiungere argomenti di script senza fortuna. Ho anche provato ad aggiungerli al percorso dello script (_path in esempio) senza fortuna. Ho provato con CreateScriptSourceFrom File e CreateScriptSourceFromSting (che è stato comunque un colpo lungo ...).

È possibile anche quello che sto cercando di fare?

È stato utile?

Soluzione

Quando si crea il motore, è possibile aggiungere un " Argomenti " L'opzione contiene i tuoi argomenti:

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

Ora sys.argv conterrà ["foo", "bar"].

Puoi impostare options["Arguments"] su tutto ciò che implementa ICollection<string>.

Altri suggerimenti

sys.argv alla fine restituirà i parametri effettivi passati all'app di hosting. Ecco alcuni modi per risolverlo:

  1. Riscrivi lo script per accettare le variabili globali, quindi utilizza ScriptScope.SetVariable
  2. Esegui lo script, ma fai affidamento su di esso per restituirti effettivamente una classe, su cui puoi invocare metodi (molto più facile in 4.0 con la parola chiave dinamica)
  3. Sostituisci sys.argv con la tua implementazione (dopo tutto questo è un linguaggio dinamico!)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top