在.Net Core应用中运行Python脚本
通过在.Net Core应用中运行Python脚本,可以非常方便的进行某些功能的处理。特别是考虑到Python是解释型语言,不需要像.Net 那样编译再部署。
通过使用NuGet
中的IronPython
和IronPython.StdLib
:
public class PythonScript
{
private ScriptEngine _engine;
public PythonScript()
{
_engine = Python.CreateEngine();
}
public TResult RunFromString<TResult>(string code, string variableName)
{
// for easier debugging write it out to a file and call: _engine.CreateScriptSourceFromFile(filePath);
ScriptSource source = _engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
CompiledCode cc = source.Compile();
ScriptScope scope = _engine.CreateScope();
cc.Execute(scope);
return scope.GetVariable<TResult>(variableName);
}
}
然后使用运行脚本:
var py = new PythonScript();
var result = py.RunFromString<int>("d = 8", "d");
Console.WriteLine(result);
原生的Process
和ProcessStartInfo
(个人实践出来的)
注意,需要通过执行含有Python可执行文件和参数的shell脚本来实现执行Python脚本, 有点绕,具体就是:
1, 创建一个run.bat
给Windows
系统:
C:\YOUR_PYTHON_PATH\python.exe %*
2, 创建一个run.sh
文件给LInux
系统:
#!/bin/bash
/usr/bin/python3 "$@"
3, 使用Process
and ProcessStartInfo
来运行脚本:
string fileName = null;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
fileName = "path_to_bat/run.bat"
}
else
{
fileName = "path_to_bat/run.sh"
}
ProcessStartInfo start = new ProcessStartInfo
{
FileName = fileName,
Arguments = string.Format("\"{0}\" \"{1}\"", script, args),
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using Process process = Process.Start(start);
变量script
指代需要执行的Python脚本所在位置,变量args
指代脚本需要的参数,若有多个参数,酌情修改程序片段。