2.8 KiB
Compile Python
This is a small bash script to compile one or multiple Python versions.
I use it on my laptop, using Debian, but it may work on other distribs.
On Debian (and Debian-based distribs) it needs the following dependencies:
apt install make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev \
xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
Usage
Clone the repo anywhere, then in your ~/.bashrc
add:
source PATH/To/THE/REPO/compile-python.sh
TL;DR:
$ compile-pythons
$ python3.6 --version
Python 3.6.15
$ python3.7 --version
Python 3.7.12
$ python3.8 --version
Python 3.8.12
$ python3.9 --version
Python 3.9.9
$ python3.10 --version
Python 3.10.1
$ python3.11 --version
Python 3.11.0a2
How it works
It downloads official Python sources (from
https://www.python.org/ftp/python/),
then compiles them using --with-pydebug
(it's a dev tool, don't use
it in production! Rely on your distrib in production!), and
--prefix=~/.local
, and finally installs it using make altinstall
.
Anyway it's ~67 lines of code, maybe just read it.
Be nice with distrib' provided Python
compile-python
only produces binaries on the form pythonX.Y
(like
python3.8
), so python3
and python
will always point to your
distrib' Python.
Don't hesitate to apt install python-is-python3
if you want python
to be python3
.
Functions
The file declares 3 functions:
compile-pythons
: To compile a set of usefull Python versions.compile-python
: To compile a given Python version (has autocompletion).venv
: Just a wrapper topython -m venv
that I like to use daily.
Using a function don't force you to use the others, they are not related.
compile-pythons
This is probably the one you're seeking, it compiles a bunch of usefull Python verisons, typically usefull if you use tox and need multiple Python versions to test your project.
compile-python
This one is used by compile-python
but you can use it manually, like:
compile-python 3.10.1
venv
A bit unrelated to the two others, here for historical reasons, this is how I create venvs. I use it like:
$ venv
If the venv does not exists it's created, if it exist it's just activated.
It takes an optional parameter: the Python version to use, like venv 3.10
or venv 3.6
.
The venv prompt takes the name of the current directory plus the version, like:
(compile-python)(py3.10.0) mdk@seaph:~/ $
which I find usefull, but feel free to not use it.
Why not using pyenv
?
I know pyenv
exists, I even used it back in the time. I did not
appreciated the shims
part (I'm not saying it's bad), so I tried
myself as something more simple: just build Python and that's it.