Поговорим про IronPython

Расскажем об интересном проекте 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. Должно получиться примерно так:

Поговорим про IronPython

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

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

static public ScriptEngine engine; static public ScriptScope scope;

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

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

Поговорим про 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

Верно! У нас получилось написать простейшее приложение с применением этой технологии. Кажется, мы решили «детскую» задачку – написали простейший калькулятор, который умеет только складывать два числа. Но разве не с простых «детских» задач начинается изучение чего-то нового?!Это неплохая возможность в изучении с использованием уже знакомых инструментов. С помощью 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 и подарит возможность взглянуть на некоторые вещи под иным углом.

3
Начать дискуссию