質問
IronPython 2を使用するC#アプリケーションに埋め込みスクリプトエンジンがあります。Pythonランタイムを作成し、グローバルネームスペースにいくつかのクラスを追加して、スクリプトがモジュールとしてインポートできるようにします。
しかし、私が理解できない(かなり基本的な)ことの1つは、スクリプト引数を送信する方法です。引数のリストを使用して変数を作成できることを理解していますが、適切な方法が必要です。また、適切な「Python」の方法でそれを行うと、スクリプトをコンパイルし、Sphinxと呼ばれる自動化されたドキュメントビルダーを使用できます。そのため、最終的な目標は次を使用できるようにすることです。
import sys
sys.argv
スクリプトの1つで、ユーザーが指定した引数を取得します(C#アプリを使用)。
今、次を使用してスクリプトを呼び出します。
// set up iron python runtime engine
_engine = Python.CreateEngine();
_runtime = _engine.Runtime;
_scope = _engine.CreateScope();
// run script
_script = _engine.CreateScriptSourceFromFile(_path);
_script.Execute(_scope);
そして、私は幸運にもスクリプト引数を追加するためのAPIを検索しようとしました。また、それらをスクリプトパス(例では_path)に追加しようとしましたが、うまくいきませんでした。 CreateScriptSourceFrom FileとCreateScriptSourceFromStingを試しました(とにかく長いショットでした...)。
私がやろうとしていることは可能ですか?
解決
エンジンを作成するときに、<!> quot; Arguments <!> quot;を追加できます。オプションには引数が含まれます:
IDictionary<string, object> options = new Dictionary<string, object>();
options["Arguments"] = new [] { "foo", "bar" };
_engine = Python.CreateEngine(options);
現在sys.argv
には["foo", "bar"]
が含まれます。
options["Arguments"]
を実装する任意のものにICollection<string>
を設定できます。
他のヒント
sys.argvは、最終的にホスティングアプリに渡される実際のパラメーターを返します。これを解決するいくつかの方法を次に示します。
- グローバル変数を受け入れるようにスクリプトを書き直してから、ScriptScope.SetVariableを使用します
- スクリプトを実行しますが、実際にクラスを返すためにスクリプトを使用します。クラスはメソッドを呼び出すことができます(動的キーワードを使用する4.0でははるかに簡単です)
- sys.argvを独自の実装でオーバーライドします(これは結局動的言語です!)