Время прочтения: 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;
}
В указанном выше коде выполняется построчно следующее:
- Исполняется файл по указанному адресу, в котором определена функция
- Функция из Python определяется в C#
- Вычисляется значение функции с учетом введенных значений
- В текстовое поле, предполагавшееся для ответа, записывается результат арифметической операциилибо ошибка, которая возникла при выполнении.
Ну и сам 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 и подарит возможность взглянуть на некоторые вещи под иным углом.