2016-04-27 5 views
0

Wenn ich versuche, einen Verweis auf eine IronPython-Engine-Instanz hinzuzufügen, wird das Referenzget den Referenzen wie erwartet hinzugefügt. Wenn ich eine andere Instanz der Engine erstelle, wird die AddReference ohne einen Fehler ausgeführt, aber die Referenz wird den Referenzen nicht hinzugefügt, und Importanweisungen schlagen mit "kein Modul namens ..." fehl.Warum schlägt clr.AddReference auf der zweiten IronPython-Engine fehl?

var engine = Python.CreateEngine(); 
dynamic clr = engine.Runtime.GetClrModule(); 
clr.AddReference("IronPython.StdLib"); 
var references = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // ok 

var source = "import pydoc\npydoc.plain(pydoc.render_doc(str))"; 
var result = engine.Execute<string>(source); 
Debug.Assert(result.StartsWith("Python Library Documentation")); // ok 

var engine2 = Python.CreateEngine(); 
dynamic clr2 = engine2.Runtime.GetClrModule(); 
clr2.AddReference("IronPython.StdLib"); 
var references2 = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references2.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // fails 

result = engine.Execute<string>(source); // throws ImportException "no module named pydoc" 
Debug.Assert(result.StartsWith("Python Library Documentation")); 

ich versuchte, mit der binären Freisetzung von Iron 2.7.5 (to GAC installiert ist) und 4,5 # C ist IronPython.StdLib eine vorkompilierte DLL des Pythons Standard lib mit pyc.

Ich habe auch mit selbst kompilierten IronPython 2.7.5 und 2.7.6 von Github versucht, aber dort die erste engine.execute schlägt bereits mit , obwohl die Referenz hinzugefügt wird.

Mache ich etwas falsch oder ist es nur ein Fehler?

Antwort

0

Ein Kollege hat den Grund für den Fehler herausgefunden. Ich poste es hier, falls jemand anderes über dieses Problem stolpert.

Sie müssen die Baugruppe laden, nachdem die Referenz Zugabe:

var engine = Python.CreateEngine(); 
dynamic clr = engine.Runtime.GetClrModule(); 
clr.AddReference("IronPython.StdLib"); 

// load assembly into engine 
var assembly = Assembly.LoadFrom("IronPython.StdLib.dll"); 
engine.Runtime.LoadAssembly(assembly); 

var references = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // ok 

var source = "import pydoc\npydoc.plain(pydoc.render_doc(str))"; 
var result = engine.Execute<string>(source); 
Debug.Assert(result.StartsWith("Python Library Documentation")); // ok 

var engine2 = Python.CreateEngine(); 
dynamic clr2 = engine2.Runtime.GetClrModule(); 
clr2.AddReference("IronPython.StdLib"); 

// load assembly into engine2 
engine2.Runtime.LoadAssembly(assembly); 

var references2 = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references2.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // does not fail 

result = engine.Execute<string>(source); // does not throw any more 
Debug.Assert(result.StartsWith("Python Library Documentation")); 
Verwandte Themen