是否可以在 .NET/C# 环境中生产 Python 代码而无需安装 Python 且无需将 Python 代码转换为 C#,即仅按原样部署代码?
我知道安装 Python 语言是合理的做法,但我的犹豫是我只是不想在我的生产环境中引入一种新语言并处理它的测试和维护复杂性,因为我不有足够的人手了解 Python 来处理这些问题。
我知道 IronPython 是基于 CLR 构建的,但不知道如何在 .NET 中托管和维护它。它是否使人们能够将 PYthon 代码视为可以导入到 C# 代码中的“包”,而无需实际将 Python 安装为独立语言?在这种情况下,IronPython 如何让我的生活更轻松? python.net 可以给我更多的影响力吗?
最佳答案
正如我在评论中提到的,正确且更好的方法是在您的 Python
代码上创建 Restful 服务,并从 C#
代码发出 http 请求.我不知道您对 Python 中的网络框架了解多少,但您可以使用大量的框架。根据您的需要,我建议 Flask这是用于创建 Restful Web 服务的轻量级微型 Web 框架。
对于示例来说,这是非常简单的 Flask 网络服务:(您可以检查它的运行版本 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
上面代码的运行版本是now runnable on .NET Fiddle .
长话短说:
要了解和学习 Flask,请查看其 documentions . (它又短又好)。我确定您将拥有复杂的网络服务,例如接受复杂或 pocco 对象作为您的网络服务输入并返回复杂对象(如 json)作为网络服务结果。
在那种情况下,您需要了解 Flask jsonify
的工作原理,此链接会告诉您 how .
好的,另一方面,在您的 C# 应用程序中,您也会有那些复杂的对象和场景。您需要知道如何序列化、反序列化等。
Microsoft 在这里的教程做得很好:
和
https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8
关于c# - 在不安装 Python 的情况下在 .NET 环境中运行 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56743561/