【问题标题】:Script arguments and Embedded IronPython脚本参数和嵌入式 IronPython
【发布时间】:2009-10-21 14:51:28
【问题描述】:

我的 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 (无论如何,这是一个很长的镜头......)。

我正在尝试做的事情可能吗?

【问题讨论】:

    标签: c# .net ironpython


    【解决方案1】:

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

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

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

    您可以将options["Arguments"] 设置为实现ICollection&lt;string&gt; 的任何内容。

    【讨论】:

    • 您没有指定版本,但这可能需要 2.6 - 我没有 2.0 可以检查。
    • 在 python 脚本端是否需要任何额外的东西才能使其工作?
    【解决方案2】:

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

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

    【讨论】:

    • 嗯...我认为#3将是要走的路。我想我将不得不在我的 ScriptScope 中执行 'import sys' 和 'sys.argv = args' 作为来自 C# 的语句?然后我的脚本中的'import sys'和'args = sys.argv'会起作用,是吗?我必须在脚本中这样做(当 sys 存在时导入 sys)才能让 Sphinx 将我的脚本识别为有效的 Python 并创建文档。
    猜你喜欢
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多