source: TI05-delivery/trunk/virtual-python.py @ 1439

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/trunk/virtual-python.py@1441
Revision 1439, 3.8 KB checked in by spascoe, 13 years ago (diff)

Continuing transition to use setuptools. Eggs will now build but
examples and test cases are broken.

Line 
1"""Create a "virtual" Python installation
2
3Based on a script created by Ian Bicking."""
4
5import sys, os, optparse, shutil
6join = os.path.join
7py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
8
9def mkdir(path):
10    if not os.path.exists(path):
11        print 'Creating %s' % path
12        os.makedirs(path)
13    else:
14        if verbose:
15            print 'Directory %s already exists'
16
17def symlink(src, dest):
18    if not os.path.exists(dest):
19        if verbose:
20            print 'Creating symlink %s' % dest
21        os.symlink(src, dest)
22    else:
23        print 'Symlink %s already exists' % dest
24
25
26def rmtree(dir):
27    if os.path.exists(dir):
28        print 'Deleting tree %s' % dir
29        shutil.rmtree(dir)
30    else:
31        if verbose:
32            print 'Do not need to delete %s; already gone' % dir
33
34def make_exe(fn):
35    if os.name == 'posix':
36        oldmode = os.stat(fn).st_mode & 07777
37        newmode = (oldmode | 0555) & 07777
38        os.chmod(fn, newmode)
39        if verbose:
40            print 'Changed mode of %s to %s' % (fn, oct(newmode))
41
42def main():
43    if os.name != 'posix':
44        print "This script only works on Unix-like platforms, sorry."
45        return
46
47    parser = optparse.OptionParser()
48   
49    parser.add_option('-v', '--verbose', action='count', dest='verbose',
50        default=0, help="Increase verbosity")
51       
52    parser.add_option('--prefix', dest="prefix", default='~',
53        help="The base directory to install to (default ~)")
54       
55    parser.add_option('--clear', dest='clear', action='store_true',
56        help="Clear out the non-root install and start from scratch")
57       
58    parser.add_option('--no-site-packages', dest='no_site_packages',
59        action='store_true',
60        help="Don't copy the contents of the global site-packages dir to the "
61             "non-root site-packages")
62   
63    options, args = parser.parse_args()
64    global verbose
65
66    home_dir = os.path.expanduser(options.prefix)
67    lib_dir = join(home_dir, 'lib', py_version)
68    inc_dir = join(home_dir, 'include', py_version)
69    bin_dir = join(home_dir, 'bin')
70
71    if sys.executable.startswith(bin_dir):
72        print 'Please use the *system* python to run this script'
73        return
74
75    verbose = options.verbose
76    assert not args, "No arguments allowed"
77       
78    if options.clear:
79        rmtree(lib_dir)
80        rmtree(inc_dir)
81        print 'Not deleting', bin_dir
82
83    prefix = sys.prefix
84    mkdir(lib_dir)
85    stdlib_dir = join(prefix, 'lib', py_version)
86    for fn in os.listdir(stdlib_dir):
87        if fn != 'site-packages':
88            symlink(join(stdlib_dir, fn), join(lib_dir, fn))
89
90    mkdir(join(lib_dir, 'site-packages'))
91    if not options.no_site_packages:
92        for fn in os.listdir(join(stdlib_dir, 'site-packages')):
93            symlink(join(stdlib_dir, 'site-packages', fn),
94                    join(lib_dir, 'site-packages', fn))
95
96    mkdir(inc_dir)
97    stdinc_dir = join(prefix, 'include', py_version)
98    for fn in os.listdir(stdinc_dir):
99        symlink(join(stdinc_dir, fn), join(inc_dir, fn))
100
101    if sys.exec_prefix != sys.prefix:
102        exec_dir = join(sys.exec_prefix, 'lib', py_version)
103        for fn in os.listdir(exec_dir):
104            symlink(join(exec_dir, fn), join(lib_dir, fn))
105
106    mkdir(bin_dir)
107    print 'Copying %s to %s' % (sys.executable, bin_dir)
108    py_executable = join(bin_dir, 'python')
109    if sys.executable != py_executable:
110        shutil.copyfile(sys.executable, py_executable)
111        make_exe(py_executable)
112
113    pydistutils = os.path.expanduser('~/.pydistutils.cfg')
114    if os.path.exists(pydistutils):
115        print 'Please make sure you remove any previous custom paths from'
116        print "your", pydistutils, "file."
117
118    print "You're now ready to download ez_setup.py, and run"
119    print py_executable, "ez_setup.py"
120     
121if __name__ == '__main__':
122    main()
123
Note: See TracBrowser for help on using the repository browser.