[omniORB] How to pass sequence<any> as parameter from Python

Joel Wagner Joel.Wagner at veritas.com
Mon Apr 12 11:25:21 BST 2004


I'd read the spec and trolled the omniorb mail archive.  Both were very
useful but I'm still stuck on this issue.

Joel

-----Original Message-----
From: Alex Tingle [mailto:alex.omniorb at firetree.net] 
Sent: Monday, April 12, 2004 10:20 AM
To: Joel Wagner
Cc: omniorb-list at omniorb-support.com
Subject: Re: [omniORB] How to pass sequence<any> as parameter from Python

On Mon, 12 Apr 2004 09:44:00 -0400
Joel Wagner <Joel.Wagner at veritas.com> wrote:

> I have a Python client that I'm trying to use to pass a 
> 'sequence<any>' to a server.

Here's a link to the Python language mapping spec. I find it quite
readable:

  http://www.omg.org/technology/documents/formal/python.htm

regards,

-Alex Tingle


_____________________________________________ 
From: 	Joel Wagner  
Sent:	Monday, April 12, 2004 9:44 AM
To:	'omniorb-list at omniorb-support.com'
Subject:	How to pass sequence<any> as parameter from Python

I have a Python client that I'm trying to use to pass a 'sequence<any>' to a
server.

Here is the IDL:

module V {
    typedef sequence<any> ANY_SEQ;
    struct Rec {
        long        a;
        long        b;
        long        c;
    };
    interface X {
        // long Exec( in long Cmd, inout sequence<any> Args ); // causes IDL
compilation error
        //     $ omniidl -bomniidl_be/python xxx.idl
        //     xxx.idl:10: Syntax error in operation parameters
        //     omniidl: 1 error.

        long Exec( in long Cmd, inout ANY_SEQ Args ); 
    };
};


Here is the client code:

import sys
import omniORB
from omniORB import CORBA
from omniORB import any

import V

orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
ior = sys.argv[1]
obj = orb.string_to_object(ior)
server = obj._narrow(V.X)

rec = V.Rec
rec.a = 0
rec.b = 1
rec.c = 2

if sys.argv[2] == '1':
    print '--- try #1'
    xany = any.to_any(rec)
    resp = server.Exec(1, [xany])
    print 'resp', resp

if sys.argv[2] == '2':
    print '--- try #2'
    tc = CORBA.TypeCode(CORBA.id(V.ANY_SEQ))
    xany = CORBA.Any(tc, [rec])
    resp = server.Exec(1, xany)
    print 'resp', resp


First question is why does the following IDL cause a compilation error, must
I use the ANY_SEQ typedef?

	long Exec( in long Cmd, inout sequence<any> Args ); // causes IDL
compilation error

Second question is what is the proper way to pass a sequence<any> as a
parameter from Python?  Both try #1 and #2 produce omniORB.CORBA.BAD_PARAM:
Minor: BAD_PARAM_WrongPythonType exceptions.


Thanks in advance for any assistance,

Joel



More information about the omniORB-list mailing list