嵌入 IronPython 并覆盖环境变量

Embedding IronPython and overwriting Environment Variables

我在 C# 应用程序中嵌入了一个 IronPython 解释器来执行 Python 脚本。该脚本使用 os.environ['VAR1']

评估特定环境变量 VAR1

我需要在执行脚本之前临时更改 VAR1 的值。为此,我调用

Environment.SetEnvironmentVariable("VAR1", "NEW_VALUE");

在 C# 代码中。不幸的是,这不起作用。 Python 脚本仍然 "sees" VAR1 的旧值(托管 C# 应用程序启动时的值)。

这是一个完整的示例代码:

        Environment.SetEnvironmentVariable("VAR1", "NEW_VALUE");
        var engine = Python.CreateEngine();
        engine.SetSearchPaths(new string[] { @"c:\Program Files (x86)\IronPython 2.7\Lib\" });
        var ms = new MemoryStream();
        engine.Runtime.IO.SetOutput(ms, Encoding.Unicode);

        var script = engine.CreateScriptSourceFromString("import os\nprint os.environ['VAR1']");
        script.Execute();

        System.Windows.Forms.MessageBox.Show(Encoding.Unicode.GetString(ms.ToArray()));

我的理解是 IronPython 引擎与 C# 主机应用程序在同一进程中运行。如果这是正确的,Python 代码和 C# 代码怎么会看到不同的环境变量?

是否有更好的(有效的)方法来为 Python 脚本设置环境变量?

好吧,我仍然不知道为什么上面的代码不起作用,但是可以通过执行设置变量 Python 的代码在 Python 环境中简单地设置一个环境变量 执行真正的代码之前:

engine.CreateScriptSourceFromString("import os\nos.environ['VAR1'] = 'NEW_VALUE'").Execute();
var CodeIReallyWantToRun = engine.CreateScriptSourceFromFile(...);
CodeIReallyWantToRun.Execute();