如何在.NET-Core应用程序中使用Python?我需要这个用于Hackathon的目的,因此解决方案不必是“优雅的”。我已经读过直接运行Python脚本是不可能的,因为标准ASP.NET只存在IronPython库但.NET-Core没有。 那么使用Python脚本最简单的方法是什么? (因为它是hackathon,甚至可以使用PHP服务器或selenium等来执行脚本)
答案 0 :(得分:13)
试试这个
public class RunCmd
{
public string Run(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "python";
start.Arguments = string.Format("\"{0}\" \"{1}\"", cmd, args);
start.UseShellExecute = false;// Do not use OS shell
start.CreateNoWindow = true; // We don't need new window
start.RedirectStandardOutput = true;// Any output, generated by application will be redirected back
start.RedirectStandardError = true; // Any error in standard output will be redirected back (for example exceptions)
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string stderr = process.StandardError.ReadToEnd(); // Here are the exceptions from our Python script
string result = reader.ReadToEnd(); // Here is the result of StdOut(for example: print "test")
return result;
}
}
}
}
然后
var res = new RunCmd().Run("your_python_file.py","params");
Console.WriteLine(res);
答案 1 :(得分:2)
由于它显示为Google的第一批条目之一,因此可能还应该提到IronPython现在完全支持.NetCore,并且可以使用NuGet轻松安装。
此方法更简单,因为它减少了代码行,并且减少了安装和管理的运行时。另外,将执行保持在进程中有很多好处(性能,调试,类型安全性等)。
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="IronPython" Version="2.7.10" />
<PackageReference Include="IronPython.StdLib" Version="2.7.10" />
</ItemGroup>
...
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);