##// END OF EJS Templates
Life, the Universe, and Everything
Life, the Universe, and Everything

File last commit:

r22963:2961b531
r22964:63780027
Show More
ipython_win_post_install.py
137 lines | 4.4 KiB | text/x-python | PythonLexer
/ scripts / ipython_win_post_install.py
#!python
"""Distutils post installation script for Windows.
http://docs.python.org/2/distutils/builtdist.html#the-postinstallation-script
"""
import os
import sys
import shutil
try:
import setuptools
have_setuptools = True
except ImportError:
have_setuptools = False
pjoin = os.path.join
# suffix for start menu folder names
pyver = "(Py%i.%i %i bit)" % (sys.version_info[0], sys.version_info[1],
(32, 64)[sys.maxsize > 2**32])
def mkshortcut(target, description, linkdir, arguments="", iconpath='',
workdir="%HOMEDRIVE%%HOMEPATH%", iconindex=0):
"""Make a shortcut if it doesn't exist and register its creation."""
filename = pjoin(linkdir, description + '.lnk')
description = "%s %s" % (description, pyver)
create_shortcut(target, description, filename, arguments, workdir,
iconpath, iconindex)
file_created(filename)
def arguments(scriptsdir, script, scriptargs=''):
"""Return command line arguments to be passed to the python executable."""
cmdbase = suffix(pjoin(scriptsdir, script))
if have_setuptools:
cmdbase += '-script.py'
return '"%s" %s' % (cmdbase, scriptargs)
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
python = pjoin(sys.prefix, 'python.exe')
pythonw = pjoin(sys.prefix, 'pythonw.exe')
if not have_setuptools:
# This currently doesn't work without setuptools,
# so don't bother making broken links
print("Setuptools is required to"
" create Start Menu items.", file=sys.stderr)
print("Re-run this installer after installing"
" Setuptools 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 %s' % pyver)
# 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',
]
programs = [suffix(p) for p in programs]
scripts = pjoin(sys.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()
# Create Start Menu shortcuts
iconpath = pjoin(scripts, 'ipython.ico')
mkshortcut(python, 'IPython', ip_start_menu,
arguments(scripts, 'ipython'), iconpath)
mkshortcut(python, 'IPython (pylab mode)', ip_start_menu,
arguments(scripts, 'ipython', '--pylab'), iconpath)
iconpath = pjoin(scripts, 'ipython_nb.ico')
mkshortcut(python, 'IPython Notebook', ip_start_menu,
arguments(scripts, 'ipython', 'notebook'), iconpath)
mkshortcut(pythonw, 'IPython Documentation', ip_start_menu,
'-m webbrowser -t "http://ipython.org/documentation.html',
iconpath='url.dll')
# 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
#mkshortcut(python, 'IPython%s (command prompt mode)', ip_start_menu,
# arguments(scripts, 'ipython', 'profile=pysh --init'))
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 the"
" 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)