From: Floris v. N. <flo...@gm...> - 2006-04-16 10:45:47
|
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=3D['testcomserver.py'], scripts=3D['testcomserver.py'], name=3D'testcomserver') actual script: from urllib import urlopen import sys import pythoncom class Runescape1: _reg_clsctx_ =3D 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_ =3D "__main__.Runescape1" _reg_clsid_ =3D "{6CF99217-4AE8-486A-9858-BE798F8671BC}" _reg_progid_ =3D "Python.Runescape1" _public_methods_ =3D ['Lookup', 'ChangeXP', 'ServerStatus', 'MultiplyStr= ing'] _public_attrs_ =3D ['softspace', 'noCalls'] _readonly_attrs_ =3D ['noCalls'] def __init__(self): self.softspace =3D 1 self.noCalls =3D 0 def Lookup(self, nick): url =3D "http://hiscore.runescape.com/lang/en/aff/runescape/hiscorep= ersonal.ws?user1=3D" + nick f =3D urlopen(url, 'r').read() search_start =3D '<a href=3D"overall.ws?table=3D0&user=3D' search_end =3D '</table>' f =3D f[f.find(search_start):f.find(search_end)] f =3D f.replace('Not Ranked', 'N/A N/A N/A') while '<' in f: a =3D f.find('<') b =3D f.find('>') f =3D f[:a] + f[b+1:] if 'does not feature in the hiscores' in f: f =3D '' for x in range(89): f +=3D ' ' return f def ChangeXP(self, xp): if len(xp) > 3: xp =3D xp[:len(xp)-3] + ',' + xp[len(xp)-3:] if len(xp) > 7: xp =3D xp[:len(xp)-7] + ',' + xp[len(xp)-7:] return xp def ServerStatus(self): servers =3D [] servers1 =3D '' url =3D 'http://www.runescape.com/serverlist.ws?plugin=3D0&lores.x= =3D232&lores.y=3D82' f =3D urlopen(url).read() f =3D f[f.find('<img src=3D"http://www.runescape.com/lang/en/aff/runescape/img/serverlist/harrow= _down.gif'):] while '<' in f: a =3D f.find('<') b =3D f.find('>') f =3D f[:a] + f[b+1:] for a in range(1,122): search =3D 'World ' + str(a) + ' ' start =3D f.find(search) servers +=3D [f[start+6:start+len(search)+4]] if ';Type Wo' in servers: del servers[servers.index(';Type Wo')] servers =3D servers[:115] + ['116 DOWN'] + servers[115:] for a in servers: servers1 +=3D a + ',' return servers1 def MultiplyString(self, string, times): string =3D times*string return string if hasattr(sys, 'importers'): # we are running as py2exe-packed executable pythoncom.frozen =3D 1 if __name__=3D=3D'__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 |
From: Larry B. <lar...@we...> - 2006-04-17 19:16:38
|
Floris van Nee wrote: > 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 > > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting language > that extends applications into web and mobile media. Attend the live webcast > and join the prime developer group breaking into this new coding territory! > http://sel.as-us.falkag.net/sel?cmd=k&kid0944&bid$1720&dat1642 From the main py2exe docs page (http://www.py2exe.org/) COM servers COM servers are built by passing a com_server keyword argument to the setup function, again the value must be a list of Python module names containing one or more COM server classes (identified by their _reg_progid_ attribute): # setup.py from distutils.core import setup import py2exe setup(com_server=["win32com.server.interp"]) Note: You use com_server= instead of a console= in setup.py. -Larry Bates |