2011-11-25 18 views
5

Al usar IronPython alojado, la variable especial __name__ devuelve como <module> en lugar de __main__. Encontré algo de discusión aquí: http://lists.ironpython.com/pipermail/users-ironpython.com/2006-August/003274.html. Pero no sé cómo aplicarlo a mi código:¿Cómo configuro __name__ a '__main__' cuando uso IronPython alojado?

public static void RunPythonFile(string filename) 
{ 
    // This is the Key to making sure that Visual Studio can debug 
    // the Python script. This way you can attach to 3dsMax.exe 
    // and catch exceptions that occur right at the correct location 
    // in the Python script. 
    var options = new Dictionary<string, object>(); 
    options["Debug"] = true; 

    // Create an instance of the Python run-time 
    var runtime = Python.CreateRuntime(options); 

    // Retrive the Python scripting engine 
    var engine = Python.GetEngine(runtime); 

    // Get the directory of the file 
    var dir = Path.GetDirectoryName(filename);      

    // Make sure that the local paths are available. 
    var paths = engine.GetSearchPaths();     
    paths.Add(dir); 
    engine.SetSearchPaths(paths); 

    // Execute the file 
    engine.ExecuteFile(filename); 
} 

Respuesta

6

Usted tendrá que utilizar una funcionalidad poco más bajo nivel de la API de alojamiento:

ScriptEngine engine = Python.CreateEngine(); 
    ScriptScope mainScope = engine.CreateScope(); 

    ScriptSource scriptSource = engine.CreateScriptSourceFromFile("test.py", Encoding.Default, SourceCodeKind.File); 

    PythonCompilerOptions pco = (PythonCompilerOptions) engine.GetCompilerOptions(mainScope); 

    pco.ModuleName = "__main__"; 
    pco.Module |= ModuleOptions.Initialize; 

    CompiledCode compiled = scriptSource.Compile(pco); 
    compiled.Execute(mainScope); 

Tomado de http://mail.python.org/pipermail/ironpython-users/2011-November/015419.html.

2
var engine = Python.CreateEngine(); 
var scope = engine.CreateScope(); 
scope.SetVariable("__name__", "__main__"); 
var scr = engine.CreateScriptSourceFromString("print __name__", SourceCodeKind.Statements); 
scr.Execute(scope); 

y de archivo:

var scr = engine.CreateScriptSourceFromFile(fname, Encoding.UTF8, SourceCodeKind.Statements); 
Cuestiones relacionadas