4.2. Używanie v-q z poziomu pythona

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 :-)

Hosted by: BerliOS Logo SourceForge.net Logo