# Python
# ======
# Slackware 14.0: python 2.7.3
# Slackware 14.1: python 2.7.5
# Slackware 14.2: python 2.7.11
# Slackware 15.0: python2 2.7.18, python3 3.9.10
#
# Some of them include security-patched versions in 'patches'.
#
# Slackware 9.1 and up also include 'python-demo' and 'python-tools'
# packages, but they were merged back into 'python' in 11.0
#
# Slackware 14.2 and up include python-pillow (instead of pil) and
# python-setuptools packages. Those are covered here:
# PIL
# setuptools
# Below I include the latest 3.8 and 2.7 releases.
# If you are using Mailman 2.x, you need Python 2.7
# If you are using Mailman 3.x, you need Python >= 3.4 for the core and
# 2.7 for the web UI and archiver (it may be >= 3.x for all now, it's been a
# while)
# As long as your shebang (1st line of a script) uses the path to the
# specific version, you should be able to have multiple major versions of
# Python installed.
#
# #!/usr/bin/python2
# #!/usr/bin/python2.7
# #!/usr/bin/python3
#
# You should also run programs like 'pip' as the specific
# version, like 'pip2.7' or 'pip3' if you have one 2.x and one 3.x version
# installed.
# If you want to make sure there are no old files left over from previous
# releases that may cause issues when upgrading, skip down to the bottom
# for uninstall instructions.
# Python 3.8.18 (2023-08-24)
# =============
# If you're about to upgrade from 3.7.x to 3.8.x, read this:
# https://docs.python.org/3/whatsnew/3.8.html
# for info about changes between the two versions. For more info read
# Misc/NEWS.
# Get it
cd
test -f installed/Python-3.8.18.tar.xz && mv installed/Python-3.8.18.tar.xz .
test ! -f Python-3.8.18.tar.xz &&
wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz
# Extract it
mkdir -p -m 0700 ~/src
cd ~/src
find -maxdepth 1 -type d -name "Python-3.*" -exec rm -r {} \;
tar xJvf ~/Python-3.8.18.tar.xz
cd Python-3.8.18
test $UID = 0 && chown -R root:root .
# Apply this patch if you are 64-bit and do not want everything to
# end up in /usr/lib (instead of /usr/lib64)
# (configure does not abide by it's own --libdir flag)
# https://stackoverflow.com/questions/41558535/python-3-6-installation-and-lib64
# https://build.opensuse.org/package/view_file/openSUSE:Factory/python38/F00102-lib64.patch?expand=1
test $(uname -m) = 'x86_64' &&
wget -nc https://englanders.us/pub/linux/patches/notmine/\
python-3.8.18-lib64.diff && patch -p1 < python-3.8.18-lib64.diff
## Configure the build
# If you don't need pip, leave off --with-ensurepip=install
# You could just install it later, but every way I tried to do it a while
# back with 2.x, I'd get stuck with a dependency loop between the get-pip.py
# script needing urllib3, not having it, that requires something else, ...
# If you have source-installed OpenSSL under /usr/local/ssl and are 64-bit:
# (as with < 1.1.0)
test $(uname -m) = 'x86_64' -a -d /usr/local/ssl/lib64 &&
LDFLAGS=-L/usr/local/ssl/lib64 \
./configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man \
--enable-shared --with-ensurepip=install
# If you are 64-bit but do not have a /usr/local/ssl/lib64
# (as with OpenSSL 1.1.0 and 3.0)
test $(uname -m) = 'x86_64' -a ! -d /usr/local/ssl/lib64 &&
./configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man \
--enable-shared --with-ensurepip=install
# Any other situation:
test $(uname -m) != 'x86_64' &&
./configure --prefix=/usr --enable-shared --mandir=/usr/man \
--with-ensurepip=install
# Build it
make $(nproc)
# Test the build
make test
# Become root to clean up old files and to install it
su
# Remove the Slackware packages:
test -x /sbin/removepkg &&
/sbin/removepkg python python3 python-demo python-pillow python-setuptools \
python-tools
# I don't do this when upgrading from one minor version to another (3.8.17 to
# 3.8.18), but when I upgrade from one major version to another (3.7.x to
# 3.8.x) I sometimes like to blow everything away from the old version(s) to
# make sure there aren't old files lying around that will cause problems
# later. Skip down to the bottom if you want to zap everything before
# proceeding ...which may break lots of things for you.
# Install the new version
#
# Use 'make install' for whatever you want your default version of
# Python to be. i.e. what you get when you run 'python'.
#
# If you use 'make altinstall' instead, that will leave existing python
# and python-config (usually in /usr/bin) pointing to whatever it was
# already pointing to. In that case, you would need to run 'python3.8'
# this is the only 3.x one, or 'python3.8' if there are others like 3.7.x
make install
ldconfig
# If you have Python 2.x and 3.8.18 installed, and want to be able to run
# python, python-config, pip, pydoc and get 3.8.18:
( cd /usr/bin
test -L pip && rm pip
test -L pydoc && rm pydoc
test -L python && rm python
test -L python-config && rm python-config
ln -sf pip3.8 pip
ln -sf pydoc3.8 pydoc
ln -sf python3.8 python
ln -sf python3.8-config python-config )
# If this is your only Python 3.x, create symlinks so you can run
# python3, python3-config, pip3, pydoc3, ...
( cd /usr/bin
test -L pip3 && rm pip3
test -L pydoc3 && rm pydoc3
test -L python3 && rm python3
test -L python3-config && rm python3-config
ln -sf pip3.8 pip3
ln -sf pydoc3.8 pydoc3
ln -sf python3.8 python3
ln -sf python3.8-config python3-config )
# Make sure your non-root user can remove the source later
chown -R $(logname) .
chmod -R u+w .
# If you used 'make altinstall' and already had Python 2.x installed, then
# the python and python-config symlinks should still point to Python 2.x
# If you used 'make install' and you want 'python' to be 2.x, you may
# need to do this:
# ln -sf /usr/bin/python2 /usr/bin/python
# ln -sf /usr/bin/python2-config /usr/bin/python-config
# If you want to upgrade pip, with pip, run the following:
# (you may get a message saying there is a newer version of pip while using
# it)
pip install --upgrade pip
# For pip usage:
pip --help
pip install --help
# Become yourself again
exit
# Keep the tarball for later
cd
mkdir -p -m 0700 installed
rm -f installed/Python-3.*.tgz installed/Python-3.*.tar.*
mv Python-3.8.18.tar.xz installed/
# Skip down to the bottom for a list of some common Python-using apps
# Python 2.7.18 (2020-04-20)
# =============
# Python 2.7 became EoL (End of Life, no more support/upgrades) on January 1, 2020
# If you're about to upgrade from 2.6.x to 2.7.x, read this:
# http://docs.python.org/whatsnew/2.7.html
# for info about changes between the two versions. For more info read
# Misc/NEWS.
# Get it
cd
test -f installed/Python-2.7.18.tar.xz && mv installed/Python-2.7.18.tar.xz .
test ! -f Python-2.7.18.tar.xz &&
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
# Extract it
mkdir -p -m 0700 ~/src
cd ~/src
find -maxdepth 1 -type d -name "Python-2.*" -exec rm -r {} \;
tar xJvf ~/Python-2.7.18.tar.xz
cd Python-2.7.18
test $UID = 0 && chown -R root:root .
# If you are 64-bit, get this patch so we don't end up with
# /usr/lib/python2.7 and /usr/lib64/python2.7 because they hard code /lib/
# in the Python source without listening to their own configure --libdir
# Slackware source has a diff like this, but it was partial fuzz and some
# .rej this time. (fuzz for years but all successful)
test $(uname -m) = 'x86_64' &&
wget -nc https://englanders.us/pub/linux/patches/Python-2.7.18-x86_64.diff &&
patch -p1 < Python-2.7.18-x86_64.diff
## Configure the build
# If you don't need pip, leave off --with-ensurepip=install
# You could install it later, and I did not try with 2.7.18, but in the
# past, every way I tried to do install it separate from the Python
# installation itself, I would get stuck with a dependency loop between the
# get-pip.py script needing urllib3, not having it, that requires something
# else, ...
# If you have source-installed OpenSSL under /usr/local/ssl and are 64-bit:
test $(uname -m) = 'x86_64' -a -d /usr/local/ssl/lib64 &&
LDFLAGS=-L/usr/local/ssl/lib64 \
./configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man \
--enable-shared --with-ensurepip=install
# If you are 64-bit but do not have a /usr/local/ssl/lib64
# (which is the default for OpenSSL 1.1.1 and 3.0)
test $(uname -m) = 'x86_64' -a ! -d /usr/local/ssl/lib64 &&
./configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man \
--enable-shared --with-ensurepip=install
# Any other situation:
test $(uname -m) != 'x86_64' &&
./configure --prefix=/usr --enable-shared --mandir=/usr/man \
--with-ensurepip=install
# Build it
make
# Become root to clean up old files and to install it
su
# Remove the Slackware packages, if there are any:
test -x /sbin/removepkg &&
/sbin/removepkg python python2 python-demo python-pillow python-setuptools \
python-tools
# I don't do this when upgrading from one minor version to another (2.7.17 to
# 2.7.18), but when I upgrade from one major version to another (2.6.x to
# 2.7.x) I sometimes like to blow everything away from the old version(s) to
# make sure there aren't old files lying around that will cause problems
# later. Skip down to the bottom if you want to zap everything before
# proceeding ...which may break lots of things for you.
# Install the new version
make install
ldconfig
## If you already had Python 3.x and just installed 2.x, but want the
## 'python' and 'python-config' symlinks to point to 3.x:
# ln -sf /usr/bin/python3 /usr/bin/python
# ln -sf /usr/bin/python3-config /usr/bin/python-config
# Make sure your non-root user can remove the source later
chown -R $(logname) .
chmod -R u+w .
# If you want to upgrade pip, with pip, run the following:
# (you may get a message saying there is a newer version of pip while using
# it)
pip install --upgrade pip
# For pip usage:
pip --help
pip install --help
# Become yourself again
exit
# Keep the tarball for later
cd
mkdir -p -m 0700 installed
rm -f installed/Python-2.*.tgz installed/Python-2.*.tar.*
mv Python-2.7.18.tar.xz installed/
# Skip down to the bottom for a list of some common Python-using apps