c# - script - 呼叫python




在.NET環境中運行Python代碼而無需安裝Python (4)

如果你必須從.NET運行一些Python代碼並且你不想用應用程序發布Python,那麼你應該使用 https://cython.org/ 東西將Python代碼編譯成EXE。

您可以在命令行中將變量傳遞給它,並通過從Python寫入控制台並捕獲從.NET生成的進程的輸出,從Python函數接收回答。 這樣就可以像調用任何其他Sub或Function一樣工作,唯一的區別是每個過程都是.NET的新進程。 如果你想要來回傳遞複雜的對象,這可能會變得非常複雜,因為你必須在它們作為文本在組件之間流動時展開和包裝它們。

最終,你最好只重寫.NET中的Python代碼,而不是沿著這條路走下去。 使用像 https://github.com/uxmal/pytocs 這樣的轉換器工具將所有Python代碼轉換為C#。 它可能不會很完美,但它會為您提供代碼庫來替換您想要使用的Python函數。 清理翻譯過程所花費的時間比嘗試維護它們之間的語言和操作間功能要少。

是否可以在.NET / C#環境中生成Python代碼而無需安裝Python並且無需將Python代碼轉換為C#,即只是按原樣部署代碼?

我知道安裝Python語言是合理的做法,但我猶豫不決的是,我只是不想在生產環境中引入新語言並處理其測試和維護的複雜性,因為我沒有足夠的人力誰知道Python來處理這些問題。

我知道IronPython是基於CLR構建的,但不知道它在.NET中是如何託管和維護的。 它是否能夠將PYthon代碼視為可以導入C#代碼的“包”,而無需將Python實際安裝為獨立語言? 在這種情況下,IronPython如何讓我的生活更輕鬆? python.net可以給我更多的槓桿嗎?


如果您不想在生產環境中引入新語言,則應保留所有代碼C#,而不是引入python。

話雖如此,您不需要'安裝'python運行時,但您需要有運行時可用。 如果這涉及安裝nuget包,一些單聲道實現,或者其他什麼,你將依賴一些依賴來解釋python命令。

這是一篇文章,我相信你會回答你的問題。 如何使用打包的python包而不安裝它


正如我在評論中提到的,正確和更好的方法是在 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 DLR的基於C的庫運行Python相比,IronPython是有限的。 我想這取決於你如何使用Python代碼,如果你想使用很多第三方python庫,我懷疑IronPython是否符合你的需求。

如何構建一個完整的Python應用程序,但從Docker運行它?

這將要求您的環境安裝Docker,但您也可以使用Docker部署.NET應用程序,它們都將被隔離,而不會污染您的“環境”。

有基本的docker圖像,專門用於構建Python和.NET項目以及運行。





python.net