Python jest językiem, który ostatnio zyskuje na popularności dlatego myślę, że warto napisać kilka słów na temat łączenia go z v-q.
Aby móc rozpocząć tworzenie aplikacji wykorzystujących v-q z pythona należy zainstalować translator IDL-a dla tego języka. Ja użyłem omniORB 4.0.5 oraz rozszerzenie omniORBpy 2.5. Instalacja jest łatwa.
Po zainstalowaniu czas wygenerować pliki dla pythona. Wykonaj polecenie:
omniidl -b python vq.idl
Wygenerowanych zostanie kilka plików i katalogów:
./vq_idl.py ./vq/__init__.py ./vq__POA ./vq__POA/__init__.py
Podczas tworzenia przykładu zauważyłem, że vq_idl.py zawiera błędy - musisz zamienić "_d__except" na "_d_except". Jeżeli tego nie zrobisz nie będziesz mógł używać wygenerowanych plików. Jeżeli masz jakieś inne problemy skontaktuj się z nami.
Oto przykład, który utworzyłem. Wywołuje on funkcję vq::ivq::dom_val w celu sprawdzenia poprawności nazwy domeny:
#!/usr/bin/env python import sys from omniORB import CORBA import CosNaming import vq orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID) obj = orb.resolve_initial_references("NameService") rootCtx = obj._narrow(CosNaming.NamingContext) if rootCtx is None: print "Failed to narrow the root naming context" sys.exit(1) name = [ CosNaming.NameComponent("VQ.ivq", "") ] try: obj = rootCtx.resolve(name) except CosNaming.NamingContext.NotFound, ex: print "Name not found" sys.exit(1) vqo = obj._narrow(vq.ivq) if vqo is None: print "Object reference is not an vq::ivq" sys.exit(1) dom = "123123.asd.com.pl" err = vqo.dom_val(dom) if err.ec is vq.ivq.err_no: print "It's a valid domain name" else: print "It's an invalid domain name"
Poniższy skrypt uruchamia omniNames (serwer nazw), iauth (pgsqlauthd) oraz ivq (qmailvqd), po czym dom_val.py (powyższy przykład). Skrypt można również znaleźć w examples/python.
#!/bin/sh export BASE=../.. export VQ_HOME=. export LD_LIBRARY_PATH="/tmp" cp -f $BASE/lib*/*.so* /tmp host=localhost echo "starting Naming Service daemon ..." rm -f /tmp/omninames-* omniNames -start 12456 -logdir /tmp & nsd_pid=$! trap "kill $nsd_pid" 0 sleep 2 echo "starting iauth(pgsqlauthd) server ..." $BASE/base/pgsql/pgsqlauthd \ -ORBIIOPAddr inet:$host:44444 \ -ORBInitRef NameService=corbaloc::$host:12456/NameService . & iauth_pid=$! trap "kill $nsd_pid $iauth_pid" 0 sleep 2 echo -ORBInitRef NameService=corbaloc::$host:12453/NameService > etc/ivq/auth echo "starting ivq(qmailvqd) server ..." $BASE/base/qmailvqd/qmailvqd \ -ORBIIOPAddr inet:$host:33333 \ -ORBInitRef NameService=corbaloc::$host:12456/NameService . & ivq_pid=$! trap "kill $nsd_pid $iauth_pid $ivq_pid" 0 sleep 2 echo "running client ..." ./dom_val.py -ORBInitRef NameService=corbaloc::$host:12456/NameService
Notatka: qmailvqd i pgsqlauthd skompilowałem używając MICO, a nie omniORB, więc jest to również przykład współdziałania różnych implementacji CORBA :-)
Poprzedni | Spis treści | Następny |
Tworzenie aplikacji korzystających z v-q | Początek rozdziału | Używanie v-q z poziomu Java |