嵌入 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();
我在 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();