mirror of
https://github.com/kennethreitz-archive/pyinstaller.git
synced 2026-06-05 15:40:17 +00:00
6c5af20757
git-svn-id: http://svn.pyinstaller.org/trunk@46 8dd32b29-ccff-0310-8a9a-9233e24343b1
167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
# Copyright (C) 2005, Giovanni Bajo
|
|
# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
import string, os, sys, win32api, Makespec
|
|
|
|
tmplt = """\
|
|
import sys
|
|
import string
|
|
import os
|
|
import pythoncom
|
|
pythoncom.frozen = 1
|
|
inprocess = getattr(sys, 'frozen', None)
|
|
|
|
%(modules)s
|
|
klasses = (%(klasses)s,)
|
|
|
|
def DllRegisterServer():
|
|
import win32com.server.register
|
|
win32com.server.register.RegisterClasses(*klasses)
|
|
return 0
|
|
|
|
def DllUnregisterServer():
|
|
import win32com.server.register
|
|
win32com.server.register.UnregisterClasses(*klasses)
|
|
return 0
|
|
|
|
if sys.frozen!="dll":
|
|
import win32com.server.localserver
|
|
for i in range(1, len(sys.argv)):
|
|
arg = string.lower(sys.argv[i])
|
|
if string.find(arg, "/reg") > -1 or string.find(arg, "--reg") > -1:
|
|
DllRegisterServer()
|
|
break
|
|
|
|
if string.find(arg, "/unreg") > -1 or string.find(arg, "--unreg") > -1:
|
|
DllUnregisterServer()
|
|
break
|
|
|
|
# MS seems to like /automate to run the class factories.
|
|
if string.find(arg, "/automate") > -1:
|
|
clsids = []
|
|
for k in klasses:
|
|
clsids.append(k._reg_clsid_)
|
|
win32com.server.localserver.serve(clsids)
|
|
break
|
|
else:
|
|
# You could do something else useful here.
|
|
import win32api
|
|
win32api.MessageBox(0, "This program hosts a COM Object and\\r\\nis started automatically", "COM Object")
|
|
"""
|
|
|
|
def create(scripts, debug, verbosity, workdir, ascii=0):
|
|
infos = [] # (path, module, klasses)
|
|
for script in scripts:
|
|
infos.append(analscriptname(script))
|
|
if not os.path.exists(workdir):
|
|
os.makedirs(workdir)
|
|
outfnm = 'drive%s.py' % infos[0][1]
|
|
outfnm = os.path.join(workdir, outfnm)
|
|
outf = open(outfnm, 'w')
|
|
klassspecs = []
|
|
modimports = []
|
|
flags = 'debug=%s, quiet=%s' % (debug, verbosity==0)
|
|
paths = []
|
|
for path, module, klasses in infos:
|
|
if path:
|
|
paths.append(path)
|
|
modimports.append("import %s" % (module,))
|
|
for klass in klasses:
|
|
klassspecs.append("%s.%s" % (module, klass))
|
|
for i in range(len(paths)):
|
|
path = paths[i]
|
|
paths[i] = win32api.GetShortPathName(os.path.normpath(path))
|
|
modimports = string.join(modimports, '\n')
|
|
klassspecs = string.join(klassspecs, ', ')
|
|
d = { 'modules':modimports,
|
|
'klasses':klassspecs,
|
|
}
|
|
outf.write( tmplt % d )
|
|
outf.close()
|
|
print "**********************************"
|
|
print "Driver script %s created" % outfnm
|
|
specfnm = Makespec.main([outfnm], console=debug, debug=debug,
|
|
workdir=workdir, pathex=paths, comserver=1, ascii=ascii)
|
|
print "Spec file %s created" % specfnm
|
|
|
|
def analscriptname(script):
|
|
# return (path, module, klasses)
|
|
path, basename = os.path.split(script)
|
|
module = os.path.splitext(basename)[0]
|
|
while ispkgdir(path):
|
|
path, basename = os.path.split(path)
|
|
module = '%s.%s' % (basename, module)
|
|
try:
|
|
__import__(module)
|
|
except ImportError:
|
|
oldpath = sys.path[:]
|
|
sys.path.insert(0, path)
|
|
try:
|
|
__import__(module)
|
|
finally:
|
|
sys.path = oldpath
|
|
else:
|
|
path = None
|
|
m = sys.modules[module]
|
|
klasses = []
|
|
for nm, thing in m.__dict__.items():
|
|
if hasattr(thing, '_reg_clsid_'):
|
|
klasses.append(nm)
|
|
return (path, module, klasses)
|
|
|
|
def ispkgdir(path):
|
|
try:
|
|
open(os.path.join(path, '__init__.py'), 'r')
|
|
except IOError:
|
|
try:
|
|
open(os.path.join(path, '__init__.pyc'), 'rb')
|
|
except IOError:
|
|
return 0
|
|
return 1
|
|
|
|
usage = """\
|
|
Usage: python %s [options] <scriptname>.py [<scriptname>.py ...]
|
|
--debug -> use debug console build and register COM servers with debug
|
|
--verbose -> use verbose flag in COM server registration
|
|
--out dir -> generate script and spec file in dir
|
|
|
|
The next step is to run Build.py against the generated spec file.
|
|
See doc/Tutorial.html for details.
|
|
"""
|
|
|
|
if __name__ == '__main__':
|
|
#scripts, debug, verbosity, workdir
|
|
debug = verbosity = ascii = 0
|
|
workdir = '.'
|
|
import getopt
|
|
opts, args = getopt.getopt(sys.argv[1:], '', ['debug', 'verbose', 'ascii', 'out='])
|
|
for opt, val in opts:
|
|
if opt == '--debug':
|
|
debug = 1
|
|
elif opt == '--verbose':
|
|
verbosity = 1
|
|
elif opt == '--out':
|
|
workdir = val
|
|
elif opt == '--ascii':
|
|
ascii = 1
|
|
else:
|
|
print usage % sys.argv[0]
|
|
sys.exit(1)
|
|
if not args:
|
|
print usage % sys.argv[0]
|
|
else:
|
|
create(args, debug, verbosity, workdir, ascii)
|