Archived
This forum has been archived. Please start a new discussion on GitHub.
Python interactive mode - invalid value for element 0
I'm trying to mimic the simple printer example, with my own dummy.ice file:
module Dummy {
struct geo {
int tsn;
string geographicvalue;
string updatedate;
string dummy;
};
sequence<geo> geolist;
interface geoops {
geolist getgeolist();
};
};
Then I tried to create a server and client in two separate python interactive prompts by following the same steps as simpleprinter:
SERVER:
>>> import Ice
>>> i = Ice.initialize()
>>> Ice.loadSlice("dummy.ice")
>>> import Dummy
>>> class geoopsi(Dummy.geoops):
... def getgeolist(self, current=None):
... return (1,"geoval", "1/1/1", "x")
>>> a = i.createObjectAdapterWithEndpoints("geoadapter", "default -p 10000")
>>> s = geoopsi()
>>> a.add(s, Ice.stringToIdentity("crap"))
crap -t:tcp -h 192.168.1.100 -p 10000
>>> a.activate()
CLIENT:
>>> import Ice
>>> Ice.loadSlice("dummy.ice")
>>> import Dummy
>>> i = Ice.initialize()
>>> b = i.stringToProxy("crap:default -p 10000")
>>> d = Dummy.geoopsPrx.checkedCast(b)
>>> d.getgeolist()
ERROR:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "dummy.ice", line 78, in getgeolist
Ice.UnknownException: exception ::Ice::UnknownException
{
unknown = exceptions.ValueError: invalid value for element 0 of `::Dummy::geolist'
}
I must be overlooking something simple, can anyone spot the problem?
One odd thing is that I _can_ call the function in the server's cmd window:
>>> s.getgeolist()
(1, 'geoval', '1/1/1', 'x')
module Dummy {
struct geo {
int tsn;
string geographicvalue;
string updatedate;
string dummy;
};
sequence<geo> geolist;
interface geoops {
geolist getgeolist();
};
};
Then I tried to create a server and client in two separate python interactive prompts by following the same steps as simpleprinter:
SERVER:
>>> import Ice
>>> i = Ice.initialize()
>>> Ice.loadSlice("dummy.ice")
>>> import Dummy
>>> class geoopsi(Dummy.geoops):
... def getgeolist(self, current=None):
... return (1,"geoval", "1/1/1", "x")
>>> a = i.createObjectAdapterWithEndpoints("geoadapter", "default -p 10000")
>>> s = geoopsi()
>>> a.add(s, Ice.stringToIdentity("crap"))
crap -t:tcp -h 192.168.1.100 -p 10000
>>> a.activate()
CLIENT:
>>> import Ice
>>> Ice.loadSlice("dummy.ice")
>>> import Dummy
>>> i = Ice.initialize()
>>> b = i.stringToProxy("crap:default -p 10000")
>>> d = Dummy.geoopsPrx.checkedCast(b)
>>> d.getgeolist()
ERROR:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "dummy.ice", line 78, in getgeolist
Ice.UnknownException: exception ::Ice::UnknownException
{
unknown = exceptions.ValueError: invalid value for element 0 of `::Dummy::geolist'
}
I must be overlooking something simple, can anyone spot the problem?
One odd thing is that I _can_ call the function in the server's cmd window:
>>> s.getgeolist()
(1, 'geoval', '1/1/1', 'x')
0
Comments
-
Welcome to the forum!
The UnknownException indicates that the problem is in the server, and the error message points out that there's a type mismatch with a sequence element. The problem is in the following code:def getgeolist(self, current=None): return (1,"geoval", "1/1/1", "x")
The return value of this operation is declared as a sequence of struct, and Ice maps a Slice struct to a Python class. You need to allocate a geo member like this:def getgeolist(self, current=None): return (geo(1,"geoval", "1/1/1", "x"),)
Also notice the extra trailing comma, which is necessary for the parser to treat this as a sequence of one element.
Take care,
- Mark0