如何在 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 脚本中的错误。外观如下:
我正在从 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 脚本中的错误。外观如下: