utility for install in zipped distutils packages

Craig D misterbike at hotmail.com
Sat Nov 13 14:50:54 EST 2004


I got really tired of unpacking a distutils package, installing then
cleaning up. So I wrote distinstall.py - it reads a zip file, unpacks
it, installs the bits and cleans up. I've only used it on windows and
Linux and for pure Python packages.
Windows: distinstall.py Photronics.zip
Linux:   python distinstall.py Photronics.zip

Hopefully somebody else will find it useful.

#======================== distinstall.py =====================
#!/usr/bin/env python
'''Install a zipped up distutils package'''

import zipfile
import sys, os, os.path

def usage():
   print "distinstall.py pack.zip: Install a zipped distutil python
package"
   print "One arg: name of the zip package"
   print "THIS PROGRAM ONLY WORKS WITH ZIPPED PURE PYTHON PACKAGES!"
   sys.exit(1)

def nuke(top):
    # Delete everything reachable from the directory named in 'top'.
    # CAUTION:  This is dangerous!  For example, if top == '/', it
    # could delete all your disk files.
    for root, dirs, files in os.walk(top, topdown=False):
       for name in files:
	  os.remove(os.path.join(root, name))
       for name in dirs:
	  os.rmdir(os.path.join(root, name))
    os.rmdir(top)
			

def explodeZipFile(zippedPackageFileName):
   if not zipfile.is_zipfile(zippedPackageFileName):
      print '"%s" is not a zip file!' % zippedPackageFileName
      usage()
   zip = zipfile.ZipFile(zippedPackageFileName,'r')
   if not filter(lambda n:"setup.py" in n, zip.namelist()):
      print "setup.py isn't in the zip file! Not a distutil package?"
      usage()

   tmp = os.getenv('TMP') or os.getenv('TMPDIR')
   if (not tmp) and os.path.isdir('/tmp'): tmp = '/tmp'
   if not tmp:
      print 'Can\'t find the tmp directory!'
      sys.exit(1)

   path,fileName = os.path.split(zippedPackageFileName)
   tmpDir = os.path.join(tmp,os.path.splitext(fileName)[0])

   print "unzip %s to %s" % (zippedPackageFileName,tmpDir)
   for z in zip.namelist():
#      print z
      data = zip.read(z)
      try:
	 os.makedirs(os.path.join(tmp,os.path.split(z)[0]),0777)
      except: pass
      f = file(os.path.join(tmp,z),'w')	#?? what's up with wb?
      f.writelines(data.split('\r'))	# this really sucks
      f.close()

   zip.close()
   setup  = os.path.join(tmpDir,"setup.py")
   return tmpDir,setup


if len(sys.argv) < 2: usage()

cwd = os.getcwd()
zippedPackageFileName = sys.argv[1]
tmpDir,setup = explodeZipFile(zippedPackageFileName)

print "====================Install================="
os.chdir(tmpDir)
install = "%s setup.py install --force" % sys.executable
print install
os.system(install)

os.chdir(cwd)
print "\nClean up %s" % tmpDir
nuke(tmpDir)	# this will clean up the build directory
#======================== distinstall.py =====================



More information about the Python-list mailing list