Frage

Ich habe ein eingebettetes Scripting-Engine in meiner C # Anwendung, den Ironpython verwendet 2. ich die Python-Laufzeit erstellen und ein paar Klassen zu den globalen Namespace hinzufügen, so dass das Skript sie als Module importieren.

Allerdings ist ein (ziemlich einfach), was ich nicht herausfinden kann, ist, wie Skript Argumente zu senden. Ich weiß, dass ich nur eine Variable mit einer Liste von Argumenten schaffen könnte, aber es muss eine richtige Art und Weise, es zu tun. Außerdem erlaubt es in dem richtigen ‚Python‘ Art und Weise zu tun mir die Skripte zu erstellen und einen automatisierten Dokumenterstellungs verwenden namens Sphinx. So ist das ultimative Ziel ist es, zu verwenden:

import sys
sys.argv

In einem meiner Skripte und haben sie die Argumente der Benutzer angegeben erhalten (durch die C # app).

Im Moment nenne ich das Skript unter Verwendung:

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

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

Und ich habe für eine API versucht der Suche Skript Argumente ohne Glück hinzuzufügen. Ich habe auch versucht, sie an den Skriptpfad (_path in Beispiel) ohne Glück anhängen. Ich habe versucht, mit CreateScriptSourceFrom Datei und CreateScriptSourceFromSting (das ist eine lange sowieso erschossen wurde ...).

Ist das, was ich versuche sogar möglich, zu tun?

War es hilfreich?

Lösung

Wenn Sie den Motor zu erstellen, können Sie eine „Argumente“ Option hinzufügen, die enthält Ihre Argumente:

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

Jetzt wird sys.argv ["foo", "bar"] enthalten.

Sie können options["Arguments"] auf etwas festlegen, die ICollection<string> implementiert.

Andere Tipps

sys.argv wird schließlich die aktuellen Parameter in die Hosting-App übergeben Rückkehr sein. Hier ein paar Möglichkeiten, dies zu lösen:

  1. Rewrite Ihr Skript Globale Variablen zu übernehmen, dann verwenden ScriptScope.SetVariable
  2. Führen Sie das Skript, sondern verlassen sich auf sie Ihnen tatsächlich geben eine Klasse, die Sie Methoden auf (viel einfacher in 4.0 mit dynamischem Schlüsselwort) aufrufen
  3. außer Kraft setzt sys.argv mit Ihrer eigenen Implementierung (dies ist eine dynamische Sprache, nachdem alle!)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top