[python-win32] com server and py2exe

Floris van Nee floris.vannee at gmail.com
Wed Apr 12 18:34:39 CEST 2006


Hi,
I'm trying to convert my Python script, which is a COM server, to an
exe file. I'm using py2exe 0.6.5. But I ran into a few problems. After
a lot of work I was able to run py2exe on my script and create the exe
file. I was able to use exectablename.exe --register and --unregister
and it returned text that it registered/unregistered the com server,
but I wasn't able to connect to it using VB .NET. VB gave me an error
saying that it couldn't create the ActiveX component. The normal
python file works normally if I try to import the com object from VB,
but the exe doesn't work. So I think there's something I do wrong in
the setup file or so, or maybe I have to put something else in my
Python file, I dont know, I hope some of you do. Here is my Python
script and the setup.py (for py2exe) script:
setup.py:

from distutils.core import setup
import py2exe

setup(console=['testcomserver.py'],
      scripts=['testcomserver.py'],
      name='testcomserver')




actual script:

from urllib import urlopen
import sys
import pythoncom
class Runescape1:
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    if hasattr(sys, 'importers'):
        # In the py2exe-packed version, specify the module.class
        # to use. In the python script version, python is able
        # to figure it out itself.
        _reg_class_spec_ = "__main__.Runescape1"
    _reg_clsid_ = "{6CF99217-4AE8-486A-9858-BE798F8671BC}"
    _reg_progid_ = "Python.Runescape1"
    _public_methods_ = ['Lookup', 'ChangeXP', 'ServerStatus', 'MultiplyString']
    _public_attrs_ = ['softspace', 'noCalls']
    _readonly_attrs_ = ['noCalls']
    def __init__(self):
        self.softspace = 1
        self.noCalls = 0
    def Lookup(self, nick):
        url = "http://hiscore.runescape.com/lang/en/aff/runescape/hiscorepersonal.ws?user1="
+ nick
        f = urlopen(url, 'r').read()
        search_start = '<a href="overall.ws?table=0&user='
        search_end = '</table>'
        f = f[f.find(search_start):f.find(search_end)]
        f = f.replace('Not Ranked', 'N/A N/A N/A')
        while '<' in f:
            a = f.find('<')
            b = f.find('>')
            f = f[:a] + f[b+1:]
        if 'does not feature in the hiscores' in f:
            f = ''
            for x in range(89):
                f += ' '
        return f
    def ChangeXP(self, xp):
        if len(xp) > 3:
            xp = xp[:len(xp)-3] + ',' + xp[len(xp)-3:]
        if len(xp) > 7:
            xp = xp[:len(xp)-7] + ',' + xp[len(xp)-7:]
        return xp
    def ServerStatus(self):
        servers = []
        servers1 = ''
        url = 'http://www.runescape.com/serverlist.ws?plugin=0&lores.x=232&lores.y=82'
        f = urlopen(url).read()
        f = f[f.find('<img
src="http://www.runescape.com/lang/en/aff/runescape/img/serverlist/harrow_down.gif'):]
        while '<' in f:
            a = f.find('<')
            b = f.find('>')
            f = f[:a] + f[b+1:]
        for a in range(1,122):
            search = 'World ' + str(a) + ' '
            start = f.find(search)
            servers += [f[start+6:start+len(search)+4]]
        if ';Type Wo' in servers:
            del servers[servers.index(';Type Wo')]
        servers = servers[:115] + ['116 DOWN'] + servers[115:]
        for a in servers:
            servers1 += a + ','
        return servers1
    def MultiplyString(self, string, times):
        string = times*string
        return string
if hasattr(sys, 'importers'):
    # we are running as py2exe-packed executable
    pythoncom.frozen = 1

if __name__=='__main__':
    if hasattr(sys, 'importers'):
        # running as packed executable.
        if '--register' in sys.argv[1:]            or '--unregister'
in sys.argv[1:]:
            # --register and --unregister work as usual
            import win32com.server.register
            win32com.server.register.UseCommandLine(Runescape1)
        else:
            # start the server.
            from win32com.server import localserver
            localserver.main()
    else:
        import win32com.server.register
        win32com.server.register.UseCommandLine(Runescape1)




That was my whole file, not all of this is probably needed for an
answer, but I thought I'd mail the whole py file. You can ignore every
function in the Runescape1 class if you want :P.


Thanks in advance,

Floris


More information about the Python-win32 mailing list