在.NET环境中运行Python代码而不安装Python

Fat*_*ici 7 .net c# python ironpython python.net

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

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

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

Pau*_*ory 6

如果您不想在生产环境中引入新语言,则应保留所有代码C#,而不要引入python。

话虽如此,您不需要“安装” python运行时,但是您需要具有可用的运行时。如果这涉及安装nuget软件包,某些mono实现或其他方法,则您将依赖某种依赖性来解释python命令。

这是一篇文章,我相信可以回答您的问题。 如何使用打包的python软件包而不安装它


Ali*_*ami 5

正如我在评论中提到的那样,正确而更好的方法是在您的Python代码上创建Restful服务,并从C#代码中进行HTTP请求。我不知道您对Python中的Web框架了解多少,但是有很多可以使用。为了您的需要,我建议使用Flask,它是轻量级的微型Web框架,用于创建Restful Web服务。

对于示例,这是非常简单的Flask Web服务:(您可以在此处检查其运行版本,我将其托管在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)
Run Code Online (Sandbox Code Playgroud)

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

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Making http-request wait ... 

5
Run Code Online (Sandbox Code Playgroud)

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

TL; DR:

为了了解和学习Flask,请查看其文献资料。(很短很不错)。我确定您将拥有复杂的Web服务,例如接受复杂或pocco对象作为Web服务输入,并返回复杂对象(如json)作为Web服务结果。

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

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

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

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

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


Pat*_*gee 5

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

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

这将需要您的环境安装Docker,但是您随后也可以使用Docker部署.NET应用程序,并且它们都将被隔离并且不会弄脏您的“环境”。

有一些基本的docker映像,它们专门用于构建Python和.NET Project以及用于运行。