|
|
#!python
|
|
|
"""Windows-specific part of the installation"""
|
|
|
|
|
|
from __future__ import print_function
|
|
|
|
|
|
import os, sys, shutil
|
|
|
pjoin = os.path.join
|
|
|
|
|
|
# import setuptools if we can
|
|
|
try:
|
|
|
import setuptools
|
|
|
except ImportError:
|
|
|
pass
|
|
|
|
|
|
|
|
|
def mkshortcut(target,description,link_file,*args,**kw):
|
|
|
"""make a shortcut if it doesn't exist, and register its creation"""
|
|
|
|
|
|
create_shortcut(target, description, link_file,*args,**kw)
|
|
|
file_created(link_file)
|
|
|
|
|
|
def suffix(s):
|
|
|
"""add '3' suffix to programs for Python 3"""
|
|
|
if sys.version_info[0] == 3:
|
|
|
s = s+'3'
|
|
|
return s
|
|
|
|
|
|
def install():
|
|
|
"""Routine to be run by the win32 installer with the -install switch."""
|
|
|
|
|
|
# Get some system constants
|
|
|
prefix = sys.prefix
|
|
|
python = pjoin(prefix, 'python.exe')
|
|
|
pythonw = pjoin(prefix, 'pythonw.exe')
|
|
|
have_setuptools = 'setuptools' in sys.modules
|
|
|
|
|
|
if not have_setuptools:
|
|
|
# This currently doesn't work without setuptools,
|
|
|
# so don't bother making broken links
|
|
|
print("Distribute (setuptools) is required to create Start Menu items.", file=sys.stderr)
|
|
|
print("Re-run this installer after installing distribute to get Start Menu items.", file=sys.stderr)
|
|
|
return
|
|
|
|
|
|
# Lookup path to common startmenu ...
|
|
|
ip_start_menu = pjoin(get_special_folder_path('CSIDL_COMMON_PROGRAMS'),
|
|
|
'IPython (Py%i.%i %i bit)' % (sys.version_info[0],
|
|
|
sys.version_info[1],
|
|
|
8*tuple.__itemsize__))
|
|
|
# Create IPython entry ...
|
|
|
if not os.path.isdir(ip_start_menu):
|
|
|
os.mkdir(ip_start_menu)
|
|
|
directory_created(ip_start_menu)
|
|
|
|
|
|
# Create .py and .bat files to make things available from
|
|
|
# the Windows command line. Thanks to the Twisted project
|
|
|
# for this logic!
|
|
|
programs = [
|
|
|
'ipython',
|
|
|
'iptest',
|
|
|
'ipcontroller',
|
|
|
'ipengine',
|
|
|
'ipcluster',
|
|
|
'irunner'
|
|
|
]
|
|
|
programs = [ suffix(p) for p in programs ]
|
|
|
scripts = pjoin(prefix,'scripts')
|
|
|
if not have_setuptools:
|
|
|
# only create .bat files if we don't have setuptools
|
|
|
for program in programs:
|
|
|
raw = pjoin(scripts, program)
|
|
|
bat = raw + '.bat'
|
|
|
py = raw + '.py'
|
|
|
# Create .py versions of the scripts
|
|
|
shutil.copy(raw, py)
|
|
|
# Create .bat files for each of the scripts
|
|
|
bat_file = file(bat,'w')
|
|
|
bat_file.write("@%s %s %%*" % (python, py))
|
|
|
bat_file.close()
|
|
|
|
|
|
# Now move onto setting the Start Menu up
|
|
|
ipybase = suffix(pjoin(scripts, 'ipython'))
|
|
|
if have_setuptools:
|
|
|
# let setuptools take care of the scripts:
|
|
|
ipybase = ipybase + '-script.py'
|
|
|
workdir = "%HOMEDRIVE%%HOMEPATH%"
|
|
|
|
|
|
link = pjoin(ip_start_menu, 'IPython.lnk')
|
|
|
cmd = '"%s"' % ipybase
|
|
|
mkshortcut(python, 'IPython', link, cmd, workdir)
|
|
|
|
|
|
# Disable pysh Start item until the profile restores functionality
|
|
|
# Most of this code is in IPython/deathrow, and needs to be updated
|
|
|
# to 0.11 APIs
|
|
|
|
|
|
# link = pjoin(ip_start_menu, 'pysh.lnk')
|
|
|
# cmd = '"%s" profile=pysh --init' % ipybase
|
|
|
# mkshortcut(python, 'IPython (command prompt mode)', link, cmd, workdir)
|
|
|
|
|
|
link = pjoin(ip_start_menu, 'pylab.lnk')
|
|
|
cmd = '"%s" --pylab' % ipybase
|
|
|
mkshortcut(python, 'IPython (pylab mode)', link, cmd, workdir)
|
|
|
|
|
|
link = pjoin(ip_start_menu, 'ipcontroller.lnk')
|
|
|
cmdbase = suffix(pjoin(scripts, 'ipcontroller'))
|
|
|
if have_setuptools:
|
|
|
cmdbase += '-script.py'
|
|
|
cmd = '"%s"' % cmdbase
|
|
|
mkshortcut(python, 'IPython controller', link, cmd, workdir)
|
|
|
|
|
|
link = pjoin(ip_start_menu, 'ipengine.lnk')
|
|
|
cmdbase = suffix(pjoin(scripts, 'ipengine'))
|
|
|
if have_setuptools:
|
|
|
cmdbase += '-script.py'
|
|
|
cmd = '"%s"' % cmdbase
|
|
|
mkshortcut(python, 'IPython engine', link, cmd, workdir)
|
|
|
|
|
|
link = pjoin(ip_start_menu, 'ipythonqt.lnk')
|
|
|
cmdbase = suffix(pjoin(scripts, 'ipython'))
|
|
|
if have_setuptools:
|
|
|
cmdbase += '-script.py'
|
|
|
cmd = '"%s" qtconsole' % cmdbase
|
|
|
mkshortcut(pythonw, 'IPython Qt Console', link, cmd, workdir)
|
|
|
|
|
|
# FIXME: These below are commented out because we don't ship the html built
|
|
|
# docs anymore. We should make the shortcut to continue existing, but as a
|
|
|
# URL to the online the docs for the right version of IPython. The stable
|
|
|
# URLs have the pattern:
|
|
|
# http://ipython.org/ipython-doc/rel-X.Y.Z/html
|
|
|
# For IPython version X.Y.Z.
|
|
|
|
|
|
## # Create documentation shortcuts ...
|
|
|
## t = prefix + r'\share\doc\ipython\manual\index.html'
|
|
|
## f = ip_start_menu + r'\Manual in HTML.lnk'
|
|
|
## mkshortcut(t,'IPython Manual - HTML-Format',f)
|
|
|
|
|
|
def remove():
|
|
|
"""Routine to be run by the win32 installer with the -remove switch."""
|
|
|
pass
|
|
|
|
|
|
|
|
|
# main()
|
|
|
if len(sys.argv) > 1:
|
|
|
if sys.argv[1] == '-install':
|
|
|
try:
|
|
|
install()
|
|
|
except OSError:
|
|
|
print("Failed to create Start Menu items, try running installer as administrator.", file=sys.stderr)
|
|
|
elif sys.argv[1] == '-remove':
|
|
|
remove()
|
|
|
else:
|
|
|
print("Script was called with option %s" % sys.argv[1], file=sys.stderr)
|
|
|
|