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 |