Obsługa silnika JavaScript w Pythonie za pomocą python-spidermonkey

python-spidermonkey to moduł dostępowy, API do silnika JavaScript SpiderMonkey. Za pomocą tej biblioteki można wykonywać kod JavaScript (obiekty, klasy i funkcje) wewnątrz skryptu Pythona. Pobieramy źródła z repozytorium:
svn export http://python-spidermonkey.googlecode.com/svn/trunk/ python-spidermonkey
I instalujemy/kompilujemy:
python setup.py install
Oto przykładowy skrypt:
from spidermonkey import Runtime
rt = Runtime()
cx = rt.new_context()
print cx.eval_script("1 + 2*3") + 3
Funkcja Runtime tworzy przestrzeń do przetrzymywania i wykonywania zmiennych, obiektów i skryptów JS. Kod zawarty w tej przestrzeni nie może wyjść poza nią. Tworzenie przestrzeni jest proste:
from spidermonkey import Runtime
rt = Runtime()
Następnie potrzebujemy "kontekstu" silnika - JSContext, który może m.in. kompilować i wykonywać skrypty, pobierać i ustawiać właściwości obiektów, wywoływać funkcje JavaScript itd. Tworzenie kontekstu to:
cx = rt.new_context()
Mając kontekst można wykonywać już kod JavaScript, jak np. proste wyrażenia:
print cx.eval_script("1 + 2")
Można też tworzyć klasy w Pythonie i używać ich w silniku JS (poniższy przykład kończył się naruszeniem ochrony pamięci na moim komputerze, Linux 64 bitowy):
from spidermonkey import Runtime
rt = Runtime()
cx = rt.new_context()

class Foo:
	def hello(self):
		print "Hello, Javascript world!"
cx.bind_class(Foo, bind_constructor=True)
print cx.eval_script("var f = new Foo(); f.hello();")
Można także pobrać obiekty z JS do Pythona:
from spidermonkey import Runtime
rt = Runtime()
cx = rt.new_context()

class Foo:
	def hello(self):
		print "Hello, Javascript world!"
cx.bind_class(Foo, bind_constructor=True)

cx.eval_script("var f = new Foo();")
f = cx.eval_script("f;")
f.hello()
Moduł ten można wykorzystać np. do wykonywania wzorów matematycznych, operacji na stringach w aplikacjach, w których użytkownicy podają własne formuły takich operacji.
RkBlog

Podstawy Pythona, 14 November 2009

Comment article
Comment article RkBlog main page Search RSS Contact