All Linux distributions come with latest stable python release. Yet, if you want to try out new python for its elegant new features. You can compile and install it side by existing python.
Steps to Install Python from source
- Clone Python repository
- Compile Python
- Install Python (altinstall)
Prerequisites:
- Git (version control system )
- build-essentials
It is recommended not to replace python that comes with OS. You may mess up with internals since many OS internals (commands) rely on default python instead install side by existing python using “make altinstall”
Clone Python Repository
You can choose to download python source at “Python Source Release” or you can proceed with git with luxury to switch between any version you want.
Python source code is available at github.com/python/cpython .
Repository Link: “https://github.com/python/cpython.git“
Clone python
git clone https://github.com/python/cpython.git
switch to cloned directory using “cd cpython”
Checkout to required python release
You can list all python releases (tags) using command “git tag“
Following command will help to list last 20 release in descending order
git tag | sort -r | head -n 20
For the sake of this article I’m switching to release v3.8.0 using “git checkout” command
git checkout v3.8.0
You can verify your current branch(version) switched to by using command “git branch“
Install build-essentials
Before proceeding further, consider updating package information and upgrading system
sudo apt -y update sudo apt -y upgrade
Above commands may take a while. Wait for them to complete to proceed further.
Install tools required to build and install python
apt -y install build-essential
Compile and Install Python
Compile Python
Compile Python using following commands
To install python with shared libraries run ” ./configure –enable-shared “.
./configure script takes another optional command line options–prefix. It can be used to set where final built files will be placed(installed).
Example: ./configure –prefix=/opt/python3.8
If –prefix option is used with ./configure script. It is not necessary to use “make altinstall” instead you can run “make install“
./configure make make install
Where,
- ./configure script checks all dependencies and prepares for build. If it is complaining about anything, make sure it is fixed before proceeding further(compilation).
- make tool will build files
- make install will install (or) it will put files into the destination specified by –prefix option of ./configure
After command make you may see optional modules which are not built with following message
INFO: Could not locate ffi libs and/or headers
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_bz2 _curses _curses_panel
_dbm _gdbm _hashlib
_lzma _sqlite3 _ssl
_tkinter _uuid readline
zlib
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc atexit pwd
time
Failed to build these modules:
_ctypes
Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381
If you think, you need any of the modules mentioned above are required. Don’t hesitate to install those dependencies and then repeat “./configure; make” followed by “make install” if everything goes well with make.
Install dependencies(development files) to build python optional modules mentioned in the above output message of make command
sudo apt -y install uuid-dev libssl-dev libreadline-dev zlib1g-dev libsqlite3-dev liblzma-dev libncurses5-dev libbz2-dev libgdbm-dev
Once above development packages are installed. Run “make” to build(compile) python with dependencies installed followed by “make install” .
make make altinstall
Use make altinstall if you would like to install python with out replacing default python if –prefix option is not used with ./configure script
If –prefix option is specified to ./configure script, built files will placed in that specified directory else files will be placed inside /usr/local by default. That is, inside “/usr/local/bin”, “usr/local/lib” etc.
You can find python command location using command “which python3.8”. Note: replace python3.8 with the version you have installed
which python3.8
Access Python’s Configuration Options
Once python is compiled and installed. We can access the configuration options that python was compiled with using module called “sysconfig“
Following python code will print configuration options that python was compiled with
for k, v in sysconfig.get_config_vars().items():
print("{:>20}: {}".format(k, v))
On the other hand you can also use the command “pyton3.8-config” (python*-config) to get information about python configuration
If you build and install python with ./configure’s –prefix option, all files will be placed in single directory specified with folders inside as follows,
.
├── bin
├── include
├── lib
└── share
Where,
- bin directory contains all executable files
- include directory contains all python header files like Python.h that are required for writing c extensions or python wrappers. Usually this directory will be passed with -I flag to gcc when compiling to embedded python
- lib directory contains all python modules and libraries
- share directory contains man pages that can be read with man command
Installation quick summary
- Clone python repository
- Switch to latest stable branch/tag using “git checkout” command
- Compile & install
- ./configure –prefix=$HOME/python3
- make
- make install
- Optionally create symbolic link to python executable in /usr/sbin dir if python is installed in custom location using –prefix
Troubleshooting Python compilation & installation
- Make sure you are on right branch/tag by using “git branch” command
- Check compiler version and make sure you are using latest and right gcc & g++ compilers
- Check there is not trouble with build-essentials
- If you get compiler error while compiling code with make command. Make sure right compiler, python version and installed dependencies are required versions
- Compilation errors may occur during make if choice compiler is not right one or misuse of flags