Passing an object through COM which acts like str but isn't

Rafe rafesacks at gmail.com
Fri Aug 15 09:58:03 EDT 2008


Forgive me if I mangle any terminology here, but please correct me if
I do...

I have an object which acts exactly like a string as long as I stay in
Python land. However, I am using the object in Softimage|XSI, a 3D
application on Windows. I'm getting variant erros when trying to use
my instances as I would a string.

XSI was created while (briefly) owned by Microsoft, so knowledge of
COM with excel, or anything else, should be applicable I should think.
I should also say I am a COM novice and still learning the depths of
Python.

Here is an example...

class StrLike(object):
    def __init__(self, s): self.__data = s
    def __repr__(self): return repr(self.__data)
    def __cmp__(self, string): return cmp(self.__data, string)
    def __contains__(self, char): return char in self.__data

    __data = ""
    def __Set(self, value): self.__data = value
    def __Get(self): return self.__data
    data = property(fget = __Get,
                    fset = __Set,
                    fdel = None,
                    doc  = "string-like example")


>>>s = StrLike("test")
>>>s
'test'
>>>if s == "test": print "cmp works"
cmp works


Now if I try to pass this as I would a string, roughly like so...
>>>s = StrLike("test")
>>>Application.AnObject.attribute = "test" # works fine
>>>Application.AnObject.attribute = s
ERROR : Traceback (most recent call last):
  File "<Script Block >", line 18, in <module>
    XSI.Selection[0].name = s
  File "C:\Python25\Lib\site-packages\win32com\client\dynamic.py",
line 544, in __setattr__
    self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)
TypeError: Objects of type 'StrLike' can not be converted to a COM
VARIANT



Inheriting the str type doesn't raise any errors, but it's immutible
so it won't work. The attribute I am trying to set in XSI only takes a
string. So is it possible to make a string like object work like a
string in this scenario? Is there some built-in method I am missing or
some win32com.client trick? Help?


Thanks for reading,

- Rafe



More information about the Python-list mailing list