如何在 C# 中使用 IronPython 动态编译 python py 文件

how to compile python py file using IronPython in c# dynamically

我正在从 C# 调用和执行 python(.py) 文件,但在此之前我想验证文件是有效的 python 文件还是任何 syntax/code 错误。

如何在执行文件之前动态编译 python 代码文件?

下面是我的代码

      using Microsoft.Azure.WebJobs;
      using Microsoft.Azure.WebJobs.Extensions.Http;
      using Microsoft.AspNetCore.Http;
      using Microsoft.Extensions.Logging;
      using Newtonsoft.Json;
       using IronPython.Hosting;//for DLHE             



          var engine = Python.CreateEngine();
          var scope = engine.CreateScope();
        try
            {              
           var scriptSource = engine.CreateScriptSourceFromFile(@"C:\Nidec\PythonScript\download_nrlist.py", Encoding.UTF8, Microsoft.Scripting.SourceCodeKind.File);
            var compiledCode = scriptSource.Compile();
            compiledCode.Execute(scope);
            //engine.ExecuteFile(@"C:\Nidec\PythonScript\download_nrlist.py", scope);

            // get function and dynamically invoke
            var calcAdd = scope.GetVariable("CalcAdd");
            result = calcAdd(34, 8); // returns 42 (Int32)
        }
        catch (Exception ex)
        {
            ExceptionOperations ops = engine.GetService<ExceptionOperations>();
            Console.WriteLine(ops.FormatException(ex));
        }
        return result;

我决定先编译代码再执行。那是我发现的一种方式。更新了代码。

您可以使用以下代码检查 IronPython 代码是否有错误:

public static void CheckErrors()
{
    var engine = Python.CreateEngine();

    var fileName = "myscript.py";
    var source = engine.CreateScriptSourceFromString(File.ReadAllText(fileName), fileName, SourceCodeKind.File);

    var sourceUnit = HostingHelpers.GetSourceUnit(source);

    var result = new Result();
    var context = new CompilerContext(sourceUnit, new PythonCompilerOptions(), result);
    var parser = Parser.CreateParser(context, new PythonOptions());
    parser.ParseFile(false);

    // Use the collected diagnostics from the result object here.
}

public class Result : ErrorSink
{
    public override void Add(SourceUnit source, string message, SourceSpan span, int errorCode, Severity severity)
    {
        Add(message, source.Path, null, null, span, errorCode, severity);
    }

    public override void Add(string message, string path, string code, string line, SourceSpan span, int errorCode, Severity severity)
    {
        if (severity == Severity.Ignore)
            return;

        // Collect diagnostics here.
    }
}

我们使用此代码检查 AlterNET Studio 产品的 IronPython 脚本中的错误。外观如下: