2011-11-25 26 views
5

Quando si utilizza IronPython, la variabile speciale __name__ restituisce come <module> anziché __main__. Ho trovato alcune discussioni qui: http://lists.ironpython.com/pipermail/users-ironpython.com/2006-August/003274.html. Ma io non so come applicarlo al mio codice:Come si imposta __name__ su "__main__" quando si utilizza IronPython?

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

risposta

6

Avrete bisogno di usare un po 'di più la funzionalità di basso livello dal API di hosting:

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

Tratto da 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); 

e da file:

var scr = engine.CreateScriptSourceFromFile(fname, Encoding.UTF8, SourceCodeKind.Statements); 
Problemi correlati