summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorGreg Ward <gward@python.net>2000-03-10 01:56:58 (GMT)
committerGreg Ward <gward@python.net>2000-03-10 01:56:58 (GMT)
commit7c1e5f65e32f22734b88e1b2461d8e1e3fb2d292 (patch)
tree62c3b4665eb3d820b69a0fb297a59886910f9b78 /Doc
parent09fc542b2711b04812025531c8df52ce69e4f655 (diff)
downloadcpython-7c1e5f65e32f22734b88e1b2461d8e1e3fb2d292.zip
cpython-7c1e5f65e32f22734b88e1b2461d8e1e3fb2d292.tar.gz
cpython-7c1e5f65e32f22734b88e1b2461d8e1e3fb2d292.tar.bz2
[from 2000-02-23] Description of the baroque and already-obsolete
installation scheme that Fred Drake and I cooked up. Only saved for posterity.
Diffstat (limited to 'Doc')
-rw-r--r--Doc/inst/inst.tex534
1 files changed, 534 insertions, 0 deletions
diff --git a/Doc/inst/inst.tex b/Doc/inst/inst.tex
new file mode 100644
index 0000000..e7442df
--- /dev/null
+++ b/Doc/inst/inst.tex
@@ -0,0 +1,534 @@
+\documentclass{howto}
+\usepackage{ltxmarkup}
+\usepackage{times}
+
+\title{Installing Python Modules}
+
+% The audience for this document includes people who don't know anything
+% about Python and aren't about to learn the language just in order to
+% install and maintain it for their users, i.e. system administrators.
+% Thus, I have to be sure to explain the basics at some point:
+% sys.path and PYTHONPATH at least. Should probably give pointers to
+% other docs on "import site", PYTHONSTARTUP, PYTHONHOME, etc.
+%
+% Also, I need to take into account that most modules out there don't
+% (yet) use Distutils: briefly explain the old Makefile.pre.in
+% convention (maybe move material from the E&E manual to here?), and
+% explain where to copy .py and .so files manually if the distribution
+% doesn't provide a mechanism for doing so.
+%
+% Finally, it might be useful to include all the material from my "Care
+% and Feeding of a Python Installation" talk in here somewhere. Yow!
+
+% Hey wow, Guido didn't write this one either!
+\author{Greg Ward}
+\authoraddress{E-mail: \email{gward@python.net}}
+
+% Should these be added to the standard Python doc tools? (They'll be
+% needed for my "Distributing Python Modules" guide, too.)
+\newcommand{\command}[1]{\code{#1}}
+\newcommand{\option}[1]{\code{#1}}
+\newcommand{\filevar}[1]{{\textsl{\filenq{#1}}}}
+\newcommand{\comingsoon}{\emph{Coming soon$\ \ldots$}}
+
+% And how about these? Very handy for writing pathnames (tilde for
+% Unix, backslash for DOS/Windows).
+\renewcommand{\tilde}{\raisebox{-0.5ex}{\symbol{126}}}
+\newcommand{\bslash}{\symbol{92}}
+
+
+\begin{document}
+
+\maketitle
+
+%\begin{abstract}
+%\noindent
+%Abstract this!
+%\end{abstract}
+
+\tableofcontents
+
+\section{Introduction}
+\label{sec:intro}
+
+\comingsoon
+
+\subsection{The new way: Distutils}
+\label{sec:new-way}
+
+
+\subsection{The old way (pure Python): whatever you feel like}
+\label{sec:old-way-pure}
+
+
+\subsection{The old way (extensions, \UNIX{} only): Makefile.pre.in}
+\label{sec:old-way-ext}
+
+
+
+
+
+\section{Normal Build and Install}
+\label{sec:normal-install}
+
+% This will cover:
+% * setup.py install (the usual thing)
+% * setup.py build (if you like doing things one-at-a-time)
+% * setup.py build install (not necessary unless you need to supply
+% build options--ref. next section)
+% * where things are installed, on Unix and Windows (Mac...?)
+% * simple custom install: "install --prefix=$HOME"
+\comingsoon
+
+
+\section{Custom Extension Building}
+\label{sec:custom-ext}
+
+% This will cover:
+% * normal extension build -- stress that it doesn't matter, you
+% do the same thing whether there are extensions or not
+% * what you might want to customize: compiler and compiler
+% flags (warn of the dangers); per-file compiler flags
+% (not handled yet!)
+% * when things go wrong: I don't know! (and I don't know what
+% to do, either!)
+\comingsoon
+
+
+\section{Custom Installation (\UNIX)}
+\label{sec:custom-install-unix}
+
+% XXX probably should banish mentions of Windows here to the
+% separate "Non-standard installation (Windows)" section.
+
+A \dfn{custom installation} is where you install modules to a location
+that's not in Python's default module search path. There are a couple
+of reasons you might want to do this; the most typical is simply that
+you don't have permission to write to the standard Python library
+directory. Or, even if you do have write permission to the standard
+library, you might wish to install a module distribution into a
+non-standard place for testing or experimentation. (This is especially
+useful when upgrading an existing module distribution: you might want to
+make sure that your existing scripts continue to work as before, and
+only then install the upgrade ``for real.'')
+
+(XXX terminology: I keep saying ``standard Python library directory''
+when I really mean ``the site-packages directory under the standard
+Python library directory''. Is there a better way?)
+
+In any event, you can easily install to non-standard locations with a
+couple of options to the \command{install} command:
+
+\begin{tableii}{ll}{option}{Option}{Description}
+ \lineii{prefix}{base dir for pure Python distributions
+ (overrides \code{sys.prefix})}
+ \lineii{exec-prefix}{base dir for distributions with extensions
+ (overrides \code{sys.exec_prefix})}
+ \lineii{install-lib}{install dir for top-level modules from pure
+ Python distributions}
+ \lineii{install-platlib}{install dir for top-level modules from
+ distributions with extensions}
+ \lineii{install-path}{extra path under \option{install-lib} or
+ \option{install-platlib} to install to}
+\end{tableii}
+
+
+\subsection{Prefix options}
+\label{sec:prefix-options}
+
+There are a lot of picky little rules that govern the interactions of
+these five options. As usual, it's easier to explain things with
+examples, so we'll save all the picky rules for later, after you've seen
+a bunch of examples. However, we really have to establish some ground
+rules before we can dive into the examples:
+\begin{itemize}
+\item in a normal \UNIX{} installation, \code{sys.prefix} and
+ \code{sys.exec\_prefix} are both \file{/usr/local}.
+\item in a multi-platform \UNIX{} installation, \code{sys.prefix} and
+ \code{sys.exec\_prefix} are different, and are selected when you
+ configure and build Python itself. Our canonical example of a
+ multi-platform installation will have a \code{sys.prefix} of
+ \file{/usr/local} and a \code{sys.exec\_prefix} of
+ \file{/usr/local.\filevar{plat}} (for whatever value of \filevar{plat}
+ is appropriate).
+\item the canonical place to install third-party modules is
+ either \file{\filevar{prefix}/lib/python1.\filevar{X}/site-packages}
+ or \file{\filevar{exec\_prefix}/lib/python1.\filevar{X}/site-packages}.
+ These will be referred to as ``the site-packages directories.''
+\end{itemize}
+
+
+\subsubsection{Pure Python module distribution}
+
+To demonstrate, consider a hypothetical module distribution that
+contains one top-level module and a package with two modules:
+\begin{tableii}{ll}{module}{Module}{Filename}
+ \lineii{mymod}{\filenq{mymod.py}}
+ \lineii{mypkg.mod1}{\filenq{mypkg/mod1.py}}
+ \lineii{mypkg.mod2}{\filenq{mypkg/mod2.py}}
+\end{tableii}
+where the filenames are relative to \file{build/lib} after building, or
+to some directory in \code{sys.path} after installation.
+
+The goal of installation is to copy these files into a directory in
+\code{sys.path} without interfering with the standard Python library.
+The canonical, preferred, and most obvious thing to do is to put them in
+the ``site-packages'' directory, which is exactly what the
+\command{install} comand does by default: under a normal \UNIX{} Python
+installation,
+\begin{verbatim}
+ python setup.py install
+\end{verbatim}
+installs \file{/usr/local/lib/python1.\filevar{X}/lib/site-packages/mymod.py},
+with the \module{mypkg} package in a \file{mypkg} directory under
+\file{site-packages}.
+
+However, if you were interested in a standard installation, you wouldn't
+be reading this section. The next-most-standard thing to do is to
+specify a custom prefix to override \code{sys.prefix}. For example:
+\begin{verbatim}
+ python setup.py install --prefix=/home/greg
+\end{verbatim}
+is a sensible way to install Python modules to your home directory: this
+results in the installation of \file{/home/greg/lib/python/mymod.py},
+with the \module{mypkg} modules in \file{/home/greg/lib/python/mypkg/}.
+An important point here is that in both this example and the ``plain
+vanilla'' example above, the actual installation directory is derived
+from the \option{prefix} option. However, when \option{prefix} differs
+from \code{sys.prefix}, the installation directory is derived
+differently: the Python version and \file{site-packages} are omitted.
+(The version number is part of the standard library directory name to
+describe the version of the standard library, so it doesn't make sense
+to include it in the name of a non-standard-library directory; likewise,
+\file{site-packages} is meant to denote non-standard modules living in
+the same area as the standard library, so it doesn't make sense to
+include it when installing to a non-standard library. [XXX check with
+Guido that this reasoning is valid and correct; Fred disagrees!])
+
+
+\subsubsection{Module distribution with extensions}
+
+Now let's consider a different hypothetical module distribution, which
+consists of a single package, \module{foo}, containing one pure Python
+module and one extension module:
+\begin{tableii}{ll}{module}{Module}{Filename}
+ \lineii{foo.pure}{\filenq{foo/pure.py}}
+ \lineii{foo.ext}{\filenq{foo/ext.so} (or \file{foo/extmodule.so})}
+\end{tableii}
+In this case, the two modules will be in different locations in the
+build tree: \file{build/lib/foo/pure.py} and
+\file{build/platlib/foo/ext.so}. (The \file{.so} (``shared object'')
+extension isn't universal, but it's the norm on \UNIX-like systems;
+under Windows, the extension module will be in \file{foo/ext.pyd} or
+\file{foo/extmodule.pyd}.)
+
+Consider again a standard, plain-vanilla installation:
+\begin{verbatim}
+ python setup.py install
+\end{verbatim}
+In this case, \emph{both} modules will be installed to the site-packages
+directory under \code{sys.exec\_prefix}, e.g. to
+\file{/usr/local.\filevar{plat}/lib/python1.\filevar{X}/site-packages}
+on a \UNIX{} system where Python was configured with
+\samp{--exec-prefix=/usr/local.plat}. (On Windows, again, there is no
+site-packages directory and \code{sys.prefix} and
+\code{sys.exec\_prefix} are the same---so both modules will just be
+installed to \code{sys.prefix}.)
+
+Of course, we've already established that you're not interested in
+standard installations. If you just want to install these modules to
+your home directory, and you don't maintain a multi-platform home
+directory, no problem---just set the prefix as before:
+\begin{verbatim}
+python setup.py install --prefix=/home/greg
+\end{verbatim}
+and both modules will be installed to \file{/home/greg/lib/python}.
+
+Now let's say your Python installation is in \file{/usr}---as is the
+case in many Linux distributions---but your local policy is to install
+third-party software to a network-wide \file{/usr/local} and
+\file{/usr/local.\filevar{plat}}. That is, \code{sys.prefix} and
+\code{sys.exec\_prefix} are both \file{/usr}, and you want Python
+modules to be installed to either \file{/usr/local/lib/python} or
+\file{/usr/local.\filevar{plat}/lib/python}. This is one case where you
+want to specify both \option{prefix} and \option{exec-prefix}:
+\begin{verbatim}
+python setup.py install --prefix=/usr/local \
+ --exec-prefix=/usr/local.plat
+\end{verbatim}
+An oddity of this situation is that for any given module distribution,
+you only have to supply \emph{one} of \option{prefix} and
+\option{exec-prefix}, because pure Python distributions are always
+installed under \option{prefix}, and extension-containing distributions
+are always installed under \option{exec-prefix}. For consistency's
+sake, though, it's best always to supply both---and the best way to do
+that is by using a system-wide configuration file (see
+Section~\ref{sec:config-files}).
+
+You could use a similar scheme to maintain a multi-platform personal
+Python library. For example, if you install lots of stuff to your home
+directory (not just Python modules), you might have a complete
+\file{\tilde/usr} with \file{include}, \file{man}, \file{lib}, and so
+forth. (The advantage of this scheme is that it keeps those mock system
+directories out of your home directory and makes it easier to support a
+multi-platform personal \file{usr} tree.) If you don't care about a
+multi-platform installation, you can just install with
+\begin{verbatim}
+python setup.py install --prefix=$HOME/usr
+\end{verbatim}
+But if you want to keep separate \file{usr} trees for each architecture
+that you use, you could say
+\begin{verbatim}
+python setup.py install --prefix=$HOME/usr \
+ --exec-prefix=$HOME/usr.plat
+\end{verbatim}
+for various values of \file{plat}.
+
+% this paragraph is for Michel Sanner ;-)
+(Perceptive readers will note that on a multi-platform Python
+installation, multiple identical copies of \file{foo/pure.py} will be
+installed, one for each platform. This is deliberate. First, it makes
+Python's module search algorithm simpler (XXX check this): when you say
+\samp{import foo.pure}, Python searches \code{sys.path} until it finds a
+directory containing \file{foo/__init__.py}. When it finds one, that
+directory is deemed to be the directory containing the \module{foo}
+package for this import. Even if the search algorithm were changed
+(necessitating a trip back in time to ``fix'' Python 1.5), the only way
+to make multiple candidate \module{foo} directories (one for pure
+Python, one for extension modules) would be to make copies of
+\file{__init__.py}---in which case, why not make copies of all the pure
+Python modules? Second, if you kept pure Python modules related to
+extension modules in a platform-shared directory, what happens while you
+are upgrading your favourite extension from version 1.0 to 1.1 on
+platforms X and Y? After you install 1.1 for platform X, the 1.1
+\file{.py} files will be in the platform-shared directory---but the 1.0
+extensions will still be in the platform Y directory. If the interval
+between installing 1.1 for platform X and for platform Y is long---e.g.,
+there are portability problems with platform Y---then there's a good
+probability of a version mismatch between the 1.1 Python modules and the
+1.0 extensions on platform Y. The solution to both problems is to
+install separate copies of the pure Python modules for every platform.
+In this day and age, unnecessary disk use is no argument.)
+
+Other ways to support a multi-platform personal Python library are
+discussed below, when we cover the \option{install-lib} and
+\option{install-platlib} options.
+
+
+% Gory details on the prefix options (still need to work these into the
+% surrounding text):
+XXX need to finish these rules and give them some context!
+\begin{itemize}
+\item \code{sys.exec\_prefix} (and the \option{exec-prefix} option)
+ only matters on a multi-platform installation. If you don't have a
+ multi-platform installation (or even know what that is), then you
+ don't care about \option{exec-prefix}.
+\item in a normal Windows installation, \code{sys.prefix} and
+ \code{sys.exec\_prefix} are both \file{C:\bslash Program Files\bslash
+ Python}; they are never different under Windows (XXX check!).
+\item you may supply \emph{both} of \option{prefix} and
+ \option{exec-prefix}, or \emph{neither} of them, or \emph{just}
+ \option{prefix}---but you may not supply just \option{exec-prefix}.
+\end{itemize}
+
+
+\subsection{Installation directory options}
+\label{sec:install-dirs}
+
+Most of the time, it's enough to specify just \option{prefix} (and
+possibly \option{exec-prefix})---your modules are installed to
+\file{lib/python} under one or the other, you add the appropriate
+directory to \code{sys.path}, and that's it.
+
+However, there will inevitably be times when you want finer control over
+the installation directories, and that is when the \option{install-lib},
+\option{install-platlib}, and \option{install-path} options are
+essential. Normally, \option{install-lib} and \option{install-platlib}
+are simply the directories where pure Python modules and extension
+modules, respectively, are installed. That is, top-level modules
+(modules not in a package) are installed straight to
+\option{install-lib} (or \option{install-platlib} if there are any
+extensions in the module distribution). (If \option{install-path} is
+supplied, then things are a bit more complex; we'll deal with that
+below.)
+
+Normally, \option{install-lib} and \option{install-platlib} are derived
+from \option{prefix} and/or \option{exec-prefix}. For example, if you
+don't supply anything, then \option{prefix} defaults to
+\code{sys.prefix}, and \option{install-lib} defaults to
+\file{\filevar{prefix}/lib/python1.\filevar{X}/site-packages}. If you
+supply \option{prefix} but not \option{install-lib}, then
+\option{install-lib} defaults to \file{\filevar{prefix}/lib/python}
+(unless you just happen to supply a prefix which equals
+\code{sys.prefix}, which is treated the same as if you don't supply
+\option{prefix} at all). (The rules for \option{exec-prefix} and
+\option{install-platlib} are a bit more complex; the following examples
+should clarify. Consult the Distutils source for the gory details.)
+
+To illustrate, let's go back to our hypothetical pure-Python module
+distribution containing \module{mymod}, \module{mypkg.mod1}, and
+\module{mypkg.mod2}. If you maintain a personal stash of Python modules
+in your home directory, but don't like the \file{\tilde/lib/python}
+convention, no problem---you can put the modules right in a
+\file{\tilde/python} directory with
+\begin{verbatim}
+python setup.py install --install-lib=$HOME/python
+\end{verbatim}
+which will install \file{\$HOME/python/mymod.py},
+\file{\$HOME/python/mypkg/mod1.py}, and
+\file{\$HOME/python/mypkg/mod2.py}.
+
+If you happen to install a module distribution that contains extensions,
+again that's no problem---in the absence of \option{exec-prefix},
+\option{install-platlib} defaults to \option{install-lib}, so the above
+example will also put extension modules in \file{\$HOME/python}.
+(XXX is this correct? is this the best way to describe it? should it be
+implemented this way or some other way? how should it be described?)
+
+This may not be what you want, though, if you maintain a multi-platform
+stash of Python modules in your home directory. In that case, you need
+to specify \option{install-platlib}---this is the directory where module
+distributions with extensions will be installed. For example, if you
+keep pure Python module distributions in \file{\tilde/python} and
+extension distributions in \file{\tilde/python.plat}:
+\begin{verbatim}
+python setup.py install --install-lib=$HOME/python \
+ --install-platlib=$HOME/python.plat
+\end{verbatim}
+(Just as with \option{prefix} and \option{exec-prefix}, it's only
+necessary to supply one of \option{install-lib} and
+\option{install-platlib} for any given module distribution, but to
+ensure consistency you should always supply them both using a
+configuration file (section~\ref{sec:config-files}).)
+
+An alternate way to maintain a multi-platform personal Python library is
+in \file{\tilde/lib/python} and \file{\tilde/lib/python.plat}. In that
+case, you can get away with supplying \option{prefix} and
+\option{install-platlib}:
+\begin{verbatim}
+python setup.py install --prefix=$HOME \
+ --install-platlib=$HOME/lib/python.plat
+\end{verbatim}
+
+Finally, the \option{install-path} option, which exists mainly to gum up
+the whole works---but in a productive (and important) way.
+Specifically, \option{install-path} exists to give a directory of their
+own to module distributions that wouldn't otherwise have one, i.e.\ that
+are not distributed as a (Python) package.
+
+Consider a module distribution, Foo, that consists of (pure Python)
+modules \module{foobar}, \module{foobaz}, and \module{fooqux}.
+Obviously these are related, and if the project had started in the
+Python 1.5 era (and doesn't worry about backwards compatibility with
+Python 1.4), they probably would be packaged up and called
+\module{foo.bar}, \module{foo.baz}, and \module{foo.qux}.
+Unfortunately, they aren't, but we still want the Foo modules to go into
+a directory of their own.
+
+Normally, this will be taken care of by the module developer: he adds a
+line \samp{install_path = 'Foo'} to his setup script, which has the
+following consequences:
+\begin{enumerate}
+\item instead of \option{install-lib} the modules would be installed in
+ \file{\filevar{install-lib}/Foo}
+\item if \option{install-lib} is the same as the default
+ \option{install-lib}---e.g., you supplied neither \option{prefix} or
+ \option{install-lib}---then a \file{Foo.pth} will be created in
+ \option{install-lib}, so that Python adds
+ \file{\filevar{install-lib}/Foo} to \code{sys.path}
+\item if \option{install-lib} is not the default, then a warning will be
+ printed, reminding you to add \file{\filevar{install-lib}/Foo} to
+ \code{sys.path} yourself, such as with the \code{PYTHONPATH}
+ environment variable
+\end{enumerate}
+
+Thus, you as a module installer have to be aware of the
+\option{install-path} option---especially if you maintain a personal
+stash of Python modules and don't have write permission to the standard
+library, so Distutils can't create \file{.pth} files for you---but you
+don't often have to supply it yourself. There are situations in which
+you might want to supply it, though:
+\begin{itemize}
+\item a module developer forgot to include it (the distribution really
+ should go in a directory of its own, but it won't unless you make it)
+\item you want to override the \option{install-path} supplied by the
+ developer (e.g., you'd rather have a huge jumble of files in
+ \file{site-packages} than make Python wade through a bunch of
+ \file{.pth} files at startup)
+\end{itemize}
+
+The first case is easy: say we're dealing with the Foo distribution
+again, but the developer forgot to include \option{install-path}. No
+problem, you can supply it on the command line:
+\begin{verbatim}
+python setup.py install --install-path=Foo
+\end{verbatim}
+Note that this will work just fine if you supply \option{prefix} or
+\option{install-lib}---but of course, you'll probably have to ensure
+that the \file{Foo} directory is in \code{sys.path} yourself.
+
+If you're really fanatical about keeping track of what you have
+installed, you might want to supply your own \option{install-path} that
+records the version as well as the name of the module distribution; this
+overrides any \option{install-path} included by the module developer in
+the setup script:
+\begin{verbatim}
+python setup.py install --install-path=Foo-1.3
+\end{verbatim}
+
+Finally, you can disable \option{install-path} entirely:
+\begin{verbatim}
+python setup.py install --install-path=''
+\end{verbatim}
+...but the mess that will result (modules from many different
+distributions in the same \option{install-lib} and
+\option{install-platlib} directories) is your own problem.
+
+% Points to make
+% * only one of prefix or exec_prefix matters
+% * don't have to specify exec_prefix unless != prefix
+% * thus, usually enough to supply prefix
+% * only have to supply install_lib if you don't like
+% "prefix/lib/python"
+% * likewise for install_platlib and exec_prefix
+% * don't have to supply install_platlib unless != install_lib (??)
+% * in the absence of install_path, top-level modules wind up in
+% install_lib or install_platlib
+In case you're interested, here are the exact rules for how
+\option{install-lib} and \option{install-platlib} are initialized, and
+how they and \option{install-path} affect where modules (pure Python and
+extensions) are installed to:
+\begin{itemize}
+\item If you don't supply \option{prefix} (and possibly
+ \option{exec-prefix}), then \option{install-lib} and
+ \option{install-platlib} will be, respectively,
+ \file{\filevar{\$prefix}/lib/python1.\filevar{X}/site-packages} and
+ \file{\filevar{\$exec\_prefix}/lib/python1.\filevar{X}/site-packages}. In a
+ normal \UNIX{} installation, both of these resolve to
+ \file{/usr/local/lib/python1.\filevar{X}/site-packages}.
+\item in the absence of an \option{install-path} option, top-level
+ modules and packages from a pure Python distribution are installed to
+ \option{install-lib}
+\item in the absence of an \option{install-path} option, top-level
+ modules and packages from a distribution that contains \emph{any}
+ extension modules are installed to \option{install-platlib}.
+\item \emph{there're more, but I don't remember everything offhand}
+%\item \option{install-lib} is initialized from \option{prefix} (which
+% in turn is initialized from \code{sys.prefix})---so you should
+\end{itemize}
+
+
+\section{Custom Installation (Windows)}
+\label{sec:custom-install-windows}
+
+\comingsoon
+
+
+\section{Configuration Files}
+\label{sec:config-files}
+
+\comingsoon
+
+
+
+\end{document}