脚本参数和嵌入式IronPython

4
我在我的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),但没有成功。我尝试使用CreateScriptSourceFromFile和CreateScriptSourceFromString(这本来就是个不太可能的想法...)。

我所尝试的东西有可能实现吗?

2个回答

6

当您创建引擎时,您可以添加一个“Arguments”选项,其中包含您的参数:

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>的内容。

你没有指定版本,但这可能需要2.6 - 我没有2.0来检查。 - Jeff Hardy
在Python脚本方面,是否还需要额外的内容才能使其工作? - Chris

1

sys.argv 最终将返回传递给托管应用程序的实际参数。以下是一些解决方法:

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

嗯...我想#3会是正确的方法。我想我必须在我的ScriptScope中执行'import sys'和'sys.argv = args'作为C#语句?然后在我的脚本中执行'import sys'和'args = sys.argv',是吗?我必须以这种方式在脚本中执行(import sys when sys exists),才能让Sphinx将我的脚本识别为有效的Python并创建文档。 - cgyDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接