运行 Python .NET 环境中的代码无需安装 Python

Running Python Code in .NET Environment without Installing Python

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

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

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

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

话虽如此,您不需要 'install' python 运行时,但您需要有可用的运行时。如果这涉及安装 nuget 包、一些单声道实现或其他任何东西,您将依赖一些依赖项来解释 python 命令。

这是一篇文章,我相信它可以回答您的问题。

正如我在评论中提到的,正确和更好的方法是在您的 Python 代码上创建 Restful 服务,并从 C# 中创建 http-requests ] 代码。我不知道您对 Python 中的 web-frameworks 了解多少,但是您可以使用其中的大量内容。根据您的需要,我建议 Flask 这是 light-weight micro web-framework 创建 Restful 网络服务。

对于示例来说,这是非常简单的 Flask web-service:(您可以查看它的 运行 版本 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)

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

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

上面代码的 运行 版本是 now runnable on .NET Fiddle.

TL;DR:

了解和学习Flask,看看它documentions。 (它又短又好)。我确定您会有复杂的 web-service,例如接受复杂或 pocco 对象作为您的 web-service 输入并返回复杂对象(如 json)作为 web-serivce 结果。

在那种情况下你需要知道 Flask jsonify 是如何工作的,这个 link 会告诉你 how.

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

Microsoft 在这里的教程做得很好:

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,你不想将它引入你的系统,因为它有额外的维护成本,而且你的团队缺乏它的基本知识。尽管如此,你还是想 "productionize" 不让任何人知道。

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

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

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

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

希望对您有所帮助

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

如何构建完整的 Python 应用程序,但 运行 全部来自 Docker?

这将要求您的环境安装 Docker,但您也可以使用 Docker 部署您的 .NET 应用程序,并且它们都将被隔离并且不会弄脏您的 'environment'.

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

如果您必须 运行 来自 .NET 的一些 Python 代码并且您不想 Python 与应用程序一起发布,那么您应该只编译 Python 使用类似 https://cython.org/

的代码到 EXE

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

最终,您最好只在 .NET 中重写您的 Python 代码,而根本不要走这条路。使用 https://github.com/uxmal/pytocs 之类的转换器工具将所有 Python 代码转换为 C#。它可能并不完美,但它会给你一个代码库来替换你想要使用的 Python 函数。与尝试维护两种语言和它们之间的 inter-op 功能相比,清理翻译后的过程花费的时间更少。