Время прочтения: 4 мин.

Сегодня поговорим об интересном проекте IronPython.  Описание звучит так: «IronPython — это реализация языка программирования Python с открытым исходным кодом, которая тесно интегрирована с .NET Framework. IronPython может использовать библиотеки .NET Framework и Python, а другие языки .NET могут также легко использовать код Python».

Для начала установим все необходимое. Для работы с данным проектом нам понадобиться Visual Studio(я использую 2019, .Net Framework необходим не ниже 4.5, .Net Core 2.0 или 2.1). Установить можно через менеджер Nuget Install-Package IronPython    Install-Package IronPython.StdLib. Текущая, на момент написания статьи, версия – 2.7.10.

Для начала создадим приложение Windows Forms и добавим туда все, что требуется:

using Microsoft.Scripting.Hosting;
using Microsoft.Scripting;
using IronPython.Hosting;

В этот раз не будем пытаться решать сложных проблем, придумаем что-нибудь простое и одновременно показывающее взаимодействие Python и C#. Пусть нам необходимо сложить 2 числа (и мы по каким-то причинам не хотим делать эту операцию обыкновенным способом «в столбик» или с помощью калькулятора). Для этого добавим на нашу форму 3 TextBox-а, пару Label-ов и один Button. Должно получиться примерно так:

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

Определим две переменные:

static public ScriptEngine engine;
static public ScriptScope scope;

Стоит отметить, что все, что будет взаимодействовать с IronPython, должно быть “public”.

Существует несколько методов для работы со скриптами в Ironpython:

Мне больше всего нравится способ ExecuteFile(), его и будем использовать. Для этого в метод инициализации формы добавим следующее:

engine = IronPython.Hosting.Python.CreateEngine();
scope = engine.CreateScope();
scope.SetVariable("Main", this);

Для того, чтобы выполнить какой-нибудь скрипт, добавим в код метода обработки кнопки следующий код:

Try
   {
engine.ExecuteFile(@"C:\Users\user\source\repos\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\mypy.py", scope);
       dynamic testFunction = scope.GetVariable("test_func");
var trysolve = testFunction(Double.Parse(textBox1.Text), Double.Parse(textBox2.Text));
       textBox3.Text = trysolve.ToString();

    }
catch (System.Exception ex)
    {
       textBox3.Text=ex.Message; 
    }

В указанном выше коде выполняется построчно следующее:

  1. Исполняется файл по указанному адресу, в котором определена функция
  2. Функция из Python определяется в C#
  3. Вычисляется значение функции с учетом введенных значений
  4. В текстовое поле, предполагавшееся для ответа, записывается результат арифметической операциилибо ошибка, которая возникла при выполнении.

Ну и сам Python-файл с функцией содержит код:

def test_func(var1,var2):
    return var1+var2

Проверим, как работает наш «вычислитель»:

Верно! У нас получилось написать простейшее приложение с применением этой технологии. Кажется, мы решили «детскую» задачку – написали простейший калькулятор, который умеет только складывать два числа. Но разве не с простых «детских» задач начинается изучение чего-то нового?! Лично для себя я вижу неплохую возможность в изучении с использованием уже знакомых мне инструментов. С помощью IronPython можно не только интерпретировать некоторый код, но и проводить некоторые параллели при изучении Python. К примеру, код на C#:

namespace IronPython.Example
{
    class Program
    {
        static void Main(string[] args)
        {
            string blurb = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now);
            Console.WriteLine(blurb);
        }
    }
}

Будет эквивалентен следующему коду на IronPython:

from System import DateTime, String 
blurb = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now) 
print blurb  

Есть некоторое сходство, верно?!

Если в течение какого-то продолжительного времени вы писали .Net приложения традиционным способом (запись, компиляция, тестирование, исправление, перекомпиляция, повторное тестирование, все сначала) и по каким-то причинам столкнулись с необходимостью работы со скриптами (даже необязательно для анализа данных), то IronPython может стать своеобразным «мостом» для перехода к написанию скриптов Python и подарит возможность взглянуть на некоторые вещи под иным углом.