Запуск кода Python в среде .NET без установки Python - PullRequest
7 голосов
/ 24 июня 2019

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

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

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

Ответы [ 5 ]

6 голосов
/ 02 июля 2019

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

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

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

5 голосов
/ 04 июля 2019

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

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

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

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

5 голосов
/ 02 июля 2019

Как я уже упоминал в комментариях, правильный и лучший способ сделать это - создать службы 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 #у вас будут и эти сложные объекты и сценарии.Вам нужно знать, как сериализовать, десеризовать и т. Д.

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

3 голосов
/ 02 июля 2019

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

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

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

В собственной документации IronPython упоминается https://ironpython.net/documentation/dotnet/dotnet.html#accessing-python-code-from-other-net-code

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

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

2 голосов
/ 06 июля 2019

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

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

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

...