Co to jest i co potrafi IronPython?

IronPython (IPY) to implementacja języka Python w środowisku CLR platformy .NET i Mono. W uproszczeniu jest to odmiana Pythona napisana w C# a nie w C jak standardowa wersja (CPython). Dostajemy tą samą składnię, czy bibliotekę standardową i możliwość wykonywania skryptów wszędzie tam gdzie dostępne jest Mono czy .NET. Na chwilę obecną dostępny jest IronPython 2.7 - celujący w zgodność z Pythonem 2.7.

W tym artykule postaram się przedstawić IronPythona osobom znającym Pythona, ale nie mającym styczności z platformą .NET, czy Mono.

IronPython nie jest (może nie być) w pełni kompatybilny z Pythonem na poziomie aplikacji. Podstawowa różnica to brak dostępu do wielu dodatkowych modułów Pythona (np. tych napisanych w C). Należy się też liczyć z tym, że złożone aplikacje jak np. framework Django, czy Trac nie będą działały pod IronPythonem. Z drugiej strony IronPython może używać bibliotek .NET (a tych jest bardzo dużo). Na poziomie implementacji IronPython nie posiada "Global Interpreter Lock" (GIL) przez co wielowątkowe aplikacje mogą używać wielu rdzeni procesora. Także łatwiej rozszerzać go w C#, gdyż typy C# mogą być bezpośrednio używane w IPY. Szczegóły techniczne tej implementacji opisano na wiki.python.org.

IronPython należący do rodziny .NET nie ogranicza swojej przydatności tylko do MS Windows. Bez problemu współpracuje z Mono i można używać go także na np. Linuksie. Jednym z opiekunów tego projektu jest Miguel de Icaza - twórca Mono.

Instalacja IronPython

W przypadku MS Windows pobieramy instalator z ironpython.net i gotowe. Dodatkowo można pobrać narzędzia do Visual Studio. W przypadku Linuksa jest to bardziej złożone. Po pierwsze musimy sprawdzić czy w repozytoriach dystrybucji znajdziemy IronPythona. Dystrybucje niezbyt zainteresowane Mono mogą być pozbawione potrzebnych nam pakietów. W przypadku np. Gentoo overlay mono zawiera ebuild dla przestarzałej wersji wykorzystującej jeszcze fepy (zepsuty ebuild). W ostateczności pozostaje nam pobranie paczki ZIP z ironpython.net i wywoływanie terminala IronPythona tak (zakładając że mamy już zainstalowane mono):
mono /ścieżka/do/ipy.exe
Lub w wersji bardziej rozbudowanej (używanej w Debianie i pochodnych dystrybucjach dla /usr/bin/ipy):
#!/bin/sh

if [ "$1" = "--debug" ]; then
	MONO_OPTIONS="--debug"
	shift
fi

IRONPYTHONPATH=${IRONPYTHONPATH:+$IRONPYTHONPATH:}/usr/lib/python2.6
export IRONPYTHONPATH
                
/usr/bin/mono $MONO_OPTIONS /usr/lib/ironpython/ipy.exe -X:TabCompletion "$@"

Używanie IronPythona

Pod Linuksem /usr/bin/ipy czy ipy.exe bezpośrednio z paczki dają nam dostęp do interaktywnej konsoli (tak jak w Pythonie). "ipy" może także wykonywać skrypty o podanych ścieżkach.

Dla przykładu prosty skrypt Pythona.
from datetime import datetime, timedelta

now = datetime.now()
past = now - timedelta(hours=4)

print past
Jako skrypt Pythona wykona go polecenie "python skrypt.py", a jako skrypt IronPythona - "ipy skrypt.py".

A teraz dla przykładu wykorzystajmy jakąś bibliotekę .NET (plik dll). Dla przykładu wybrałem ExcelLibrary. Na stronie projektu widzimy przykład dla C#. Pobierając paczkę z najnowszą wersją biblioteki - ExcelLibrary.dll. Z tej biblioteki można skorzystać nawet pod Linuksem. Wystarczy Mono, IronPython i zmałpowany na składnię Pythona skrypt:

import clr

# załadowanie DLL
clr.AddReference("ExcelLibrary.dll")                                                                                                                                                                                                                                                                                                    
from ExcelLibrary import SpreadSheet

workbook = SpreadSheet.Workbook()
sheet = SpreadSheet.Worksheet('Pierwszy Arkusz')
sheet.Cells[0,0] = SpreadSheet.Cell('abc')
workbook.Worksheets.Add(sheet)
workbook.Save('test.xls')
Moduł clr pozwala nam ładować biblioteki (nazwa pliku). Następnie musimy zaimportować to co nas interesuje - co wiąże się z użyciem poprawnej przestrzeni nazw (co w tych przykładach dla .NET nie zawsze jest widoczne). Warto sięgnąć do kodu (np. Workbook.cs) lub dokumentacji by wyciągnąć stosowaną przestrzeń nazw. Oczywiście do dyspozycji mamy to co domyślnie dostarcza .NET (np. Windows Forms i tonę innych komponentów), ale to już przedstawią lepiej obszerne książki ;)
RkBlog

Podstawy Pythona, 31 August 2011

Comment article
Comment article RkBlog main page Search RSS Contact