ipython_win_post_install.py
148 lines
| 4.9 KiB
| text/x-python
|
PythonLexer
/ scripts / ipython_win_post_install.py
Ville M. Vainio
|
r1032 | #!python | ||
Christoph Gohlke
|
r8814 | """Distutils post installation script for Windows. | ||
http://docs.python.org/2/distutils/builtdist.html#the-postinstallation-script | ||||
""" | ||||
Ville M. Vainio
|
r1032 | |||
MinRK
|
r5680 | from __future__ import print_function | ||
Christoph Gohlke
|
r8814 | import os | ||
import sys | ||||
import shutil | ||||
Ville M. Vainio
|
r1032 | |||
Min RK
|
r4094 | try: | ||
import setuptools | ||||
Christoph Gohlke
|
r8814 | have_setuptools = True | ||
Min RK
|
r4094 | except ImportError: | ||
Christoph Gohlke
|
r8814 | 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]) | ||||
Min RK
|
r4094 | |||
Fernando Perez
|
r4453 | |||
Christoph Gohlke
|
r8814 | 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) | ||||
Ville M. Vainio
|
r1032 | |||
MinRK
|
r5680 | def suffix(s): | ||
Christoph Gohlke
|
r8814 | """Add '3' suffix to programs for Python 3.""" | ||
MinRK
|
r5680 | if sys.version_info[0] == 3: | ||
Christoph Gohlke
|
r8814 | s = s + '3' | ||
MinRK
|
r5680 | return s | ||
Fernando Perez
|
r4453 | |||
Christoph Gohlke
|
r8814 | |||
Ville M. Vainio
|
r1032 | def install(): | ||
"""Routine to be run by the win32 installer with the -install switch.""" | ||||
Brian Granger
|
r1611 | # Get some system constants | ||
Christoph Gohlke
|
r8814 | python = pjoin(sys.prefix, 'python.exe') | ||
pythonw = pjoin(sys.prefix, 'pythonw.exe') | ||||
Min RK
|
r4094 | if not have_setuptools: | ||
# This currently doesn't work without setuptools, | ||||
# so don't bother making broken links | ||||
Christoph Gohlke
|
r8814 | 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) | ||||
Min RK
|
r4094 | return | ||
Christoph Gohlke
|
r8814 | |||
Brian Granger
|
r1611 | # Lookup path to common startmenu ... | ||
Christoph Gohlke
|
r4175 | ip_start_menu = pjoin(get_special_folder_path('CSIDL_COMMON_PROGRAMS'), | ||
Christoph Gohlke
|
r8814 | 'IPython %s' % pyver) | ||
Ville M. Vainio
|
r1032 | # Create IPython entry ... | ||
Brian Granger
|
r1611 | if not os.path.isdir(ip_start_menu): | ||
os.mkdir(ip_start_menu) | ||||
directory_created(ip_start_menu) | ||||
Christoph Gohlke
|
r8814 | |||
Brian Granger
|
r1611 | # Create .py and .bat files to make things available from | ||
Brian Granger
|
r1613 | # the Windows command line. Thanks to the Twisted project | ||
# for this logic! | ||||
Brian Granger
|
r1612 | programs = [ | ||
'ipython', | ||||
'iptest', | ||||
'ipcontroller', | ||||
'ipengine', | ||||
'ipcluster', | ||||
Christoph Gohlke
|
r8814 | 'irunner', | ||
Brian Granger
|
r1612 | ] | ||
Christoph Gohlke
|
r8814 | programs = [suffix(p) for p in programs] | ||
scripts = pjoin(sys.prefix, 'scripts') | ||||
Min RK
|
r4094 | 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 | ||||
Christoph Gohlke
|
r8814 | bat_file = file(bat, 'w') | ||
Min RK
|
r4094 | bat_file.write("@%s %s %%*" % (python, py)) | ||
bat_file.close() | ||||
Christoph Gohlke
|
r8814 | # 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) | ||||
mkshortcut(python, 'IPython Controller', ip_start_menu, | ||||
arguments(scripts, 'ipcontroller'), iconpath) | ||||
mkshortcut(python, 'IPython Engine', ip_start_menu, | ||||
arguments(scripts, 'ipengine'), iconpath) | ||||
mkshortcut(pythonw, 'IPython Qt Console', ip_start_menu, | ||||
arguments(scripts, 'ipython', 'qtconsole'), iconpath) | ||||
iconpath = pjoin(scripts, 'ipython_nb.ico') | ||||
mkshortcut(python, 'IPython Notebook', ip_start_menu, | ||||
arguments(scripts, 'ipython', 'notebook'), iconpath) | ||||
Christoph Gohlke
|
r10210 | mkshortcut(pythonw, 'IPython Documentation', ip_start_menu, | ||
'-m webbrowser -t "http://ipython.org/documentation.html', | ||||
iconpath='url.dll') | ||||
Christoph Gohlke
|
r8814 | |||
MinRK
|
r4148 | # 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 | ||||
Christoph Gohlke
|
r8814 | #mkshortcut(python, 'IPython%s (command prompt mode)', ip_start_menu, | ||
# arguments(scripts, 'ipython', 'profile=pysh --init')) | ||||
Min RK
|
r4094 | |||
Ville M. Vainio
|
r1032 | def remove(): | ||
"""Routine to be run by the win32 installer with the -remove switch.""" | ||||
pass | ||||
Fernando Perez
|
r4453 | |||
Ville M. Vainio
|
r1032 | # main() | ||
if len(sys.argv) > 1: | ||||
if sys.argv[1] == '-install': | ||||
MinRK
|
r5680 | try: | ||
install() | ||||
except OSError: | ||||
Christoph Gohlke
|
r8814 | print("Failed to create Start Menu items, try running the" | ||
" installer as administrator.", file=sys.stderr) | ||||
Ville M. Vainio
|
r1032 | elif sys.argv[1] == '-remove': | ||
remove() | ||||
else: | ||||
Christoph Gohlke
|
r8814 | print("Script was called with option %s" % sys.argv[1], | ||
file=sys.stderr) | ||||