如何在.NET-Core应用程序中使用Python?

时间:2016-12-09 16:35:35

标签: python asp.net-core ironpython .net-core

如何在.NET-Core应用程序中使用Python?我需要这个用于Hackathon的目的,因此解决方案不必是“优雅的”。我已经读过直接运行Python脚本是不可能的,因为标准ASP.NET只存在IronPython库但.NET-Core没有。 那么使用Python脚本最简单的方法是什么? (因为它是hackathon,甚至可以使用PHP服务器或selenium等来执行脚本)

2 个答案:

答案 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轻松安装。

此方法更简单,因为它减少了代码行,并且减少了安装和管理的运行时。另外,将执行保持在进程中有很多好处(性能,调试,类型安全性等)。

  1. 使用NuGet,添加最新的“ IronPython”和“ IronPython.StdLib”。 或者,将以下内容添加到项目文件中:
<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="IronPython" Version="2.7.10" />
    <PackageReference Include="IronPython.StdLib" Version="2.7.10" />
  </ItemGroup>
  ...
  1. 创建一个函数或类以使运行脚本更加方便:
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);
    }
}
  1. 运行脚本:
var py = new PythonScript();
var result = py.RunFromString<int>("d = 8", "d");
Console.WriteLine(result);