脚本参数和嵌入式IronPython

我的C#应用​​程序中有一个嵌入式脚本引擎,它使用IronPython 2.我创建Python运行时并向全局命名空间添加一些类,以便脚本可以将它们作为模块导入。

但是,一个(非常基本的)我无法弄清楚的是如何发送脚本参数。 我意识到我可以创建一个带有参数列表的变量,但必须有一个正确的方法来完成它。 此外,以正确的’Python’方式执行此操作允许我编译脚本并使用名为Sphinx的自动文档构建器。 所以最终目标是能够使用:

import sys sys.argv 

在我的一个脚本中,让它获得用户指定的参数(通过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(无论如何都是一个很长的镜头……)。

我甚至想做什么?

创建引擎时,可以添加包含参数的“Arguments”选项:

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

现在sys.argv将包含["foo", "bar"]

您可以将options["Arguments"]为实现ICollection任何内容。

sys.argv最终会返回传递给托管应用程序的实际参数。 以下是解决此问题的几种方法:

  1. 重写您的脚本以接受全局变量,然后使用ScriptScope.SetVariable
  2. 运行脚本,但依靠它来实际返回一个类,您可以调用方法(在4.0中使用动态关键字更容易)
  3. 用你自己的实现覆盖sys.argv(毕竟这是一种动态语言!)