Можно ли производить код Python в среде .NET / C # без установки Python и без преобразования кода Python в C #, т. Е. Просто развернуть код как есть?

Я знаю, что установка языка Python была бы разумной вещью, но я сомневаюсь, что я просто не хочу вводить новый язык в свою производственную среду и иметь дело с его сложностями при тестировании и обслуживании, так как у меня недостаточно рабочей силы кто знает Python, чтобы позаботиться об этих проблемах.

Я знаю, что IronPython построен на CLR, но не знаю, как именно он может быть размещен и поддерживаться в .NET. Позволяет ли он рассматривать код PYthon как «пакет», который можно импортировать в код C #, без фактической установки Python как отдельного языка? Как IronPython может облегчить мою жизнь в этой ситуации? Может ли python.net дать мне больше рычагов?

7
FatihAkici 24 Июн 2019 в 23:31

5 ответов

Лучший ответ

Как я упоминал в комментариях, правильный и лучший способ сделать это - создать службы Restful на основе вашего кода Python и выполнять http-запросы из кода C#. Я не знаю, как много вы знаете о веб-фреймворках в Python, но есть множество из них, которые вы можете использовать. Для ваших нужд я бы предложил Flask - легковесную микро-фреймворк для создания веб-служб Restful.

Это очень простой веб-сервис Flask для примера: (вы можете проверить его работающую версию здесь я разместил его на 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 ознакомьтесь с его документацией. (Это коротко и хорошо). Я уверен, что у вас будут сложные веб-сервисы, такие как принятие сложных или pocco-объектов в качестве входных данных веб-сервиса и возврат сложных объектов (как json) в качестве результатов веб-обслуживания.

В этом случае вам нужно знать, как работает Flask jsonify. По этой ссылке вы сможете узнать, как это сделать / а> .

Хорошо, с другой стороны, в вашем приложении на C # у вас будут и эти сложные объекты и сценарии. Вы должны знать, как сериализовать, deseriaze и т. Д.

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

5
Ali Bahrami 2 Июл 2019 в 04:50

Если вы не хотите вводить новый язык в свою производственную среду, вы должны оставить весь свой код C # вместо представления Python.

С учетом вышесказанного вам не нужно «устанавливать» среду выполнения Python, но вам нужно иметь доступную среду выполнения. Если это требует установки пакета nuget, какой-либо моно реализации или чего-то еще, вы будете полагаться на некоторую зависимость для интерпретации команд python.

Вот статья, которая, я думаю, отвечает на ваш вопрос. Как использовать упакованный пакет Python без его установки

6
Paul Story 1 Июл 2019 в 23:57

Если вам нужно запустить некоторый код Python из .NET и вы не хотите поставлять Python вместе с приложением, вам нужно просто скомпилировать код Python в EXE-файл, используя что-то вроде https://cython.org/

Вы можете передать ей переменные в командной строке и получить ответы обратно из функции Python, записав в консоль из Python и захватив выходные данные процесса, который вы породили из .NET. Таким образом, он будет работать так же, как и любой другой Sub или Function, с той лишь разницей, что каждая процедура - это новый процесс для .NET. Это может стать действительно сложным, если вы хотите передавать сложные объекты назад и вперед, так как вам нужно было бы развернуть и обернуть их, когда они текут, как текст, между компонентами.

В конечном счете, вам было бы лучше просто переписать код Python в .NET и вообще не идти по этому пути. Используйте конвертер, например https://github.com/uxmal/pytocs, чтобы конвертировать весь код Python в C #. Вероятно, он не будет идеальным, но он даст вам кодовую базу для работы по замене функций Python, которые вы хотите использовать. На очистку переведенных процедур у вас уйдет меньше времени, чем на поддержание между ними языков и функций взаимодействия.

1
HackSlash 5 Июл 2019 в 22:52

Я действительно не понимаю вопроса. Вы не хотите устанавливать python, вы не хотите внедрять его в свою систему, поскольку он требует дополнительных затрат на обслуживание, а ваша команда не имеет базовых знаний о нем. Тем не менее, вы хотите «произвести» это без ведома.

Мое предположение, что вы хотите иметь язык сценариев, и по какой-то причине вы выбрали Python. Мой ответ основан на этом предположении.

Именно благодаря IronPython у нас есть dynamic ключевое слово и DLR в мире .net. Вы можете разместить его в своем приложении и заставить его компилировать некоторый код Python для .net-совместимых типов.

В собственной документации IronPython упоминается https://ironpython.net/ документация / DotNet / dotnet.html # Доступ к - питон - кода из - другой - нетто- коды

Также есть сообщение в блоге MSDN, показывающее, как это сделать. https://blogs.msdn.microsoft.com/seshadripv/2008/06/30/how-to-invoke-a-ironpython-function-from-c-using-the-dlr -хостинг - апи /

Надеюсь, это поможет

3
Erdogan Kurtur 2 Июл 2019 в 15:17

IronPython ограничен по сравнению с запуском Python с библиотеками на C, для которых требуется интерпретатор Python, а не .NET DLR. Я полагаю, это зависит от того, как вы используете код Python, если вы хотите использовать множество сторонних библиотек Python, я сомневаюсь, что IronPython подойдет для ваших нужд.

Как насчет создания полноценного приложения на Python, но с запуском всего из Docker?

Это потребовало бы, чтобы в ваших средах был установлен Docker, но затем вы могли бы также развернуть свои приложения .NET также с помощью Docker, и все они были бы изолированы и не загрязняли вашу «среду».

Существуют базовые образы докеров, специально предназначенные для сборки Python и .NET Project, а также для запуска.

5
Patrick Magee 4 Июл 2019 в 10:26