c# - 调用python3 - pythonnet教程




在.NET环境中运行Python代码而无需安装Python (4)

是否可以在.NET / C#环境中生成Python代码而无需安装Python并且无需将Python代码转换为C#,即只是按原样部署代码?

我知道安装Python语言是合理的做法,但我犹豫不决的是,我只是不想在生产环境中引入新语言并处理其测试和维护的复杂性,因为我没有足够的人力谁知道Python来处理这些问题。

我知道IronPython是基于CLR构建的,但不知道它在.NET中是如何托管和维护的。 它是否能够将PYthon代码视为可以导入C#代码的“包”,而无需将Python实际安装为独立语言? 在这种情况下,IronPython如何让我的生活更轻松? python.net可以给我更多的杠杆吗?


与使用需要Python解释器而不是.NET DLR的基于C的库运行Python相比,IronPython是有限的。 我想这取决于你如何使用Python代码,如果你想使用很多第三方python库,我怀疑IronPython是否符合你的需求。

如何构建一个完整的Python应用程序,但从Docker运行它?

这将要求您的环境安装Docker,但您也可以使用Docker部署.NET应用程序,它们都将被隔离,而不会污染您的“环境”。

有基本的docker图像,专门用于构建Python和.NET项目以及运行。


如果你必须从.NET运行一些Python代码并且你不想用应用程序发布Python,那么你应该使用 https://cython.org/ 东西将Python代码编译成EXE。

您可以在命令行中将变量传递给它,并通过从Python写入控制台并捕获从.NET生成的进程的输出,从Python函数接收回答。 这样就可以像调用任何其他Sub或Function一样工作,唯一的区别是每个过程都是.NET的新进程。 如果你想要来回传递复杂的对象,这可能会变得非常复杂,因为你必须在它们作为文本在组件之间流动时展开和包装它们。

最终,你最好只重写.NET中的Python代码,而不是沿着这条路走下去。 使用像 https://github.com/uxmal/pytocs 这样的转换器工具将所有Python代码转换为C#。 它可能不会很完美,但它会为您提供代码库来替换您想要使用的Python函数。 清理翻译过程所花费的时间比尝试维护它们之间的语言和操作间功能要少。


我真的不明白这个问题。 你不想安装python,你不想将它引入你的系统,因为它有额外的维护成本,你的团队缺乏基本的知识。 不过,你想在没有人知道的情况下“生产”它。

我的假设你想要一个脚本语言,并且由于某种原因你决定使用python。 我的答案是基于这个假设。

IronPython是我们在.net世界中拥有 dynamic 关键字和DLR的原因。 您可以将它托管给您的应用程序,并使其编译一些python代码到.net兼容类型。

IronPython自己的文档提到它 https://ironpython.net/documentation/dotnet/dotnet.html#accessing-python-code-from-other-net-code

还有一篇MSDN博客文章展示了如何做到这一点。 https://blogs.msdn.microsoft.com/seshadripv/2008/06/30/how-to-invoke-a-ironpython-function-from-c-using-the-dlr-hosting-api/

希望能帮助到你


正如我在评论中提到的,正确和更好的方法是在 Python 代码上创建Restful服务,并从 C# 代码发出http请求。 我不知道你对Python中的Web框架有多了解,但是你可以使用它们。 根据您的需要,我建议使用 Flask ,这是一种轻量级的微型Web框架,可以创建Restful Web服务。

这是一个非常简单的Flask web服务示例:(你可以 here 查看它的运行版本,我在pythonOnEverywhere上托管它)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'

@app.route('/math/add/<int:num1>/<int:num2>')
def add(num1, num2):
    return '%d' % (num1+num2)

这个简单的服务,添加两个数字并返回它们的总和。

C# 代码:

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

public class Program
{
    // Always use HttpClient as a singleton object
    public static HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("http://al1b.pythonanywhere.com") } ;
    public async static Task Main()
    {

        var num1 = 1;
        var num2 = 4;

        Console.WriteLine("Making http-request wait ...\r\n");      

        var mathAddResult = await _httpClient.GetAsync($"/math/add/{num1}/{num2}");

        // 200 = OK
        if(mathAddResult.StatusCode == HttpStatusCode.OK)
        {   
            Console.WriteLine(await mathAddResult.Content.ReadAsStringAsync());
        }
    }
}

输出:

Making http-request wait ... 

5

上面代码的运行版本 现在可以在.NET Fiddle上运行

TL; DR:

要了解和学习Flask,请查看其 documentions 。 (这很简短而且很好)。 我确信您将拥有复杂的Web服务,例如接受复杂或pocco对象作为Web服务输入并将复杂对象(如json)作为web-serivce结果返回。

在这种情况下,你需要知道Flask jsonify 如何工作,这个链接会告诉你 how

好的,另一方面,在C#应用程序中,您将拥有那些复杂的对象和场景。 你需要知道如何序列化,deseriaze等。

微软在这里的教程做得很好:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8





python.net