In today’s guide you’ll learn to install Python 3.9 on CentOS 8 / CentOS 7 Linux system. Python is general-purpose, interpreted and high-level programming language originally created by Guido van Rossum. Python is created for simplicity, deep integration and great extensibility. You can achieve much more with Python using powerful libraries and tools, including Django, Pygame, Matplotlib, Plotly, e.t.c.
In the next sections we look at the installation steps of Python 3.9 on CentOS 8 / CentOS 7. If you’re interested in a full list of features shipped in Python 3.9 check the official release notes.
Install Python 3.9 on CentOS 8 / CentOS 7
Python is a cross-platform software package meaning it can run on Linux, Windows, macOS, and BSD systems. As of this article update, the exact latest release of Python 3.9 is version Python. This is the version of Python that will be installed in this tutorial.
Step 1: Install Python Dependencies
Login to your CentOS 8 / CentOS 7 system as root or user with sudo privileges.
ssh username@serveripaddress
Then do system update
sudo yum -y install epel-release
sudo yum -y update
Reboot after the upgrade before you continue to install dependencies
sudo reboot
Install required software development tools required to build Python 3.9 on CentOS 8 / CentOS 7:
sudo yum groupinstall "Development Tools" -y
sudo yum install openssl-devel libffi-devel bzip2-devel -y
Confirm gcc is available:
$ gcc --version
gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Step 2: Download latest Python Archive
Ensure wget is installed:
sudo yum install wget -y
Use wget to download the latest Python 3.9 release.
wget https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz
Extract the archive file using tar:
tar xvf Python-*.tgz
Switch to the directory created from the file extraction:
cd Python-3.9*/
Step 3: Install Python 3.9
Run the command below to configure Python installation.
./configure --enable-optimizations --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
Sample output of success:
....
checking for the Linux getrandom() syscall... yes
checking for the getrandom() function... yes
checking for library containing shm_open... -lrt
checking for sys/mman.h... (cached) yes
checking for shm_open... yes
checking for shm_unlink... yes
checking for pkg-config... /usr/bin/pkg-config
checking whether compiling and linking against OpenSSL works... yes
checking for X509_VERIFY_PARAM_set1_host in libssl... yes
checking for --with-ssl-default-suites... python
checking for --with-builtin-hashlib-hashes... md5,sha1,sha256,sha512,sha3,blake2
configure: creating ./config.status
config.status: creating Makefile.pre
config.status: creating Misc/python.pc
config.status: creating Misc/python-embed.pc
config.status: creating Misc/python-config.sh
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
creating Modules/Setup.local
creating Makefile
Build Python 3.9 on CentOS 8 / CentOS 7:
sudo make altinstall
Be patient as this takes quite some time depending on number of CPU cores in your system. If this was successful, you should get a message like below:
....
running install_scripts
copying build/scripts-3.9/pydoc3.9 -> /usr/local/bin
copying build/scripts-3.9/idle3.9 -> /usr/local/bin
copying build/scripts-3.9/2to3-3.9 -> /usr/local/bin
changing mode of /usr/local/bin/pydoc3.9 to 755
changing mode of /usr/local/bin/idle3.9 to 755
changing mode of /usr/local/bin/2to3-3.9 to 755
rm /usr/local/lib/python3.9/lib-dynload/_sysconfigdata__linux_x86_64-linux-gnu.py
rm -r /usr/local/lib/python3.9/lib-dynload/__pycache__
/usr/bin/install -c -m 644 ./Misc/python.man \
/usr/local/share/man/man1/python3.9.18
if test "xupgrade" != "xno" ; then \
case upgrade in \
upgrade) ensurepip="--altinstall --upgrade" ;; \
install|*) ensurepip="--altinstall" ;; \
esac; \
./python -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmpxqejw3c3
Processing /tmp/tmpxqejw3c3/setuptools-58.1.0-py3-none-any.whl
Processing /tmp/tmpxqejw3c3/pip-22.0.4-py3-none-any.whll
Installing collected packages: setuptools, pip
WARNING: The script easy_install-3.9 is installed in '/usr/local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The script pip3.9 is installed in '/usr/local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
...
Step 4: Check Python 3.9 installation
Run below command to confirm successful installation of Python 3.9 on CentOS 8 / CentOS 7:
$ python3.9 --version
Python 3.9.18
Pip3.9 must have been installed as well:
$ pip3.9 --version
pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
Upgrade pip
$ /usr/local/bin/python3.9 -m pip install --upgrade pip
Requirement already satisfied: pip in /usr/local/lib/python3.9/site-packages (22.0.4)
Collecting pip
Downloading pip-22.2.2-py3-none-any.whl (2.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 73.2 MB/s eta 0:00:00
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 22.0.4
Uninstalling pip-22.0.4:
Successfully uninstalled pip-22.0.4
Successfully installed pip-22.2.2
Example on installing awscli with pip3.9:
$ pip3.9 install awscli --user
Collecting awscli
Downloading awscli-1.25.49-py3-none-any.whl (3.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 65.8 MB/s eta 0:00:00
Collecting PyYAML<5.5,>=3.10
Downloading PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl (630 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 630.1/630.1 kB 21.8 MB/s eta 0:00:00
Collecting colorama<0.4.5,>=0.2.5
Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Collecting docutils<0.17,>=0.10
Downloading docutils-0.16-py2.py3-none-any.whl (548 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 548.2/548.2 kB 21.2 MB/s eta 0:00:00
Collecting s3transfer<0.7.0,>=0.6.0
Downloading s3transfer-0.6.0-py3-none-any.whl (79 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 79.6/79.6 kB 11.7 MB/s eta 0:00:00
Collecting botocore==1.27.49
Downloading botocore-1.27.49-py3-none-any.whl (9.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.0/9.0 MB 86.8 MB/s eta 0:00:00
Collecting rsa<4.8,>=3.1.2
Downloading rsa-4.7.2-py3-none-any.whl (34 kB)
Collecting urllib3<1.27,>=1.25.4
Downloading urllib3-1.26.11-py2.py3-none-any.whl (139 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.9/139.9 kB 28.9 MB/s eta 0:00:00
Collecting jmespath<2.0.0,>=0.7.1
Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Collecting python-dateutil<3.0.0,>=2.1
Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.7/247.7 kB 51.3 MB/s eta 0:00:00
Collecting pyasn1>=0.1.3
Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.1/77.1 kB 19.1 MB/s eta 0:00:00
Collecting six>=1.5
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pyasn1, urllib3, six, rsa, PyYAML, jmespath, docutils, colorama, python-dateutil, botocore, s3transfer, awscli
Successfully installed PyYAML-5.4.1 awscli-1.25.49 botocore-1.27.49 colorama-0.4.4 docutils-0.16 jmespath-1.0.1 pyasn1-0.4.8 python-dateutil-2.8.2 rsa-4.7.2 s3transfer-0.6.0 six-1.16.0 urllib3-1.26.11
Here are more guides we have on Python in our website:
- Best Books for Learning Python Programming
- Install Python 3.8 on CentOS 8 / CentOS 7
- Deploy Python 3 Django Application on CentOS 7 with Apache and mod_wsgi
- How To Install Python & Django on Debian
- Install Python 3 / Python 2.7 on CentOS 8 / RHEL 8
















































































Niceeeee!!!!
The instructions worked with Python 3.9.5 and CentOS Linux 7. Thanks Josphat!
Nice.. Welcome..
These instructions also worked with Python-3.9.5 on CentOS 8.
i got fatal error
Thanks for sharing the instructions, It is useful and easy to follow.
Alternatively you can run “python3.9 ” or “python 3.10” in terminal and Linux will take care of installation for you!
I tried it in RedHat and Rocky Linux 8.5
Here is the command I ran with following results
$ python3.9 –version
bash: python3.9: command not found…
Install package ‘python39’ to provide command ‘python3.9’? [N/y] y
* Waiting in queue…
* Loading list of packages….
The following packages have to be installed:
python39-3.9.6-2.module+el8.5.0+673+10283621.x86_64 Version 3.9 of the Python interpreter
python39-libs-3.9.6-2.module+el8.5.0+673+10283621.x86_64 Python runtime libraries
python39-pip-20.2.4-6.module+el8.5.0+673+10283621.noarch A tool for installing and managing Python3 packages
python39-pip-wheel-20.2.4-6.module+el8.5.0+673+10283621.noarch The pip wheel
python39-setuptools-50.3.2-4.module+el8.5.0+673+10283621.noarch Easily build and distribute Python 3 packages
python39-setuptools-wheel-50.3.2-4.module+el8.5.0+673+10283621.noarch The setuptools wheel
Proceed with changes? [N/y] y
* Waiting in queue…
* Waiting for authentication…
* Waiting in queue…
* Downloading packages…
* Requesting data…
* Testing changes…
* Installing packages…
Python 3.9.6
Cheers!
Stop providing wrong info. Linux doesn’t magically install things for you. You have pip installed, which is what updates your Python.
Hi everybody ! help needed !
sudo make altinstall doesn’t work for me :
make: *** No rule to make target `altinstall’. Stop.
can you help me ?
I’ve tested on CentOS 7 and CentOS Stream 8 and it works fine.
Checked on AlmaLinux 9.0. Done! Thanks!
Great!
I’ve successfully installed v3.9 using your tutorial, but when I check version with python –version cmd, it says v2.7.5. why? Thanks.
Using this on a CentOS 7 system and a slight tweak to make python3.9.17 work from my homedir. More of the newer python3 libraries like ipaddress’s subnet_of method works on CentOS 7 now!!
Since I can’t modify system files in /usr, this was my last option.
Traceback (most recent call last):
File “/home/herbisoul/app.py”, line 42, in
import sqlite3
File “/usr/local/lib/python3.9/sqlite3/__init__.py”, line 57, in
from sqlite3.dbapi2 import *
File “/usr/local/lib/python3.9/sqlite3/dbapi2.py”, line 27, in
from _sqlite3 import *
ModuleNotFoundError: No module named ‘_sqlite3’, please help
This error is experienced when performing which action?