2016-09-16 18 views
0

Ich bette einen IronPython-Interpreter in eine C# -Anwendung ein, um ein Python-Skript auszuführen. Das Skript wertet eine bestimmte Umgebungsvariable aus VAR1 mit os.environ['VAR1']Einbetten von IronPython und Überschreiben von Umgebungsvariablen

Ich muss den Wert VAR1 vorübergehend ändern, bevor das Skript ausgeführt wird. Um dies zu tun, rufe ich im C# -Code

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

an. Leider funktioniert das nicht. Das Python-Skript "sieht" immer noch den alten Wert VAR1 (der Wert, den es hatte, als die C# -Anwendung gestartet wurde). Hier

ist ein kompletter Beispielcode:

 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())); 

Mein Verständnis ist, dass der Ironpython Motor läuft im selben Prozess wie die C# Host-Anwendung. Wenn dies richtig ist, wie können der Python-Code und der C# -Code verschiedene Umgebungsvariablen sehen?

Gibt es eine bessere (funktionierende) Möglichkeit, eine Umgebungsvariable für das Python-Skript festzulegen?

Antwort

0

Nun, ich weiß noch nicht, warum der obige Code nicht funktioniert, aber man kann einfach eine Umgebungsvariable in der Python-Umgebung durch Ausführen von Python-Code festgelegt, der die Variable VOR setzt den echten Code ausführen:

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