You can follow the below provided steps to install a specific version of package using APT package manager on Debian-based Linux distributions (like Ubuntu):
Step 1: Update the Package List
Before you install or update any package, it is always a good practice to update the package list of your machine. This will ensure that your machine has the latest information about available packages and their versions inside repositories.
You will need either sudo access or you can run the following apt command as root user:
sudo apt update
Step 2. Find Available Versions of the Package
You can use apt-cache madison
command to check and list the available versions for the provided package in the repository:
apt-cache madison <package-name>
For example, to find available versions of python3
, you would use:
apt-cache madison python3
Sample Output:
python3 | 3.10.6-1~22.04 | http://in.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
python3 | 3.10.6-1~22.04 | http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
python3 | 3.10.4-0ubuntu2 | http://in.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Step 3: Decide to Install or Update
If the package is not installed and you want to install a specific version then you can use:
sudo apt install <package-name>=<version>
If the package is installed but an update is available then you can use:
sudo apt install --only-upgrade <package-name>
Let's check in my case if python3 is already installed or not using dpkg command:
$ dpkg -l python3
Sample Output:
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-==============-============-=========================================================================
ii python3 3.10.6-1~22.04 amd64 interactive high-level object-oriented language (default python3 version)
So in my case latest version of python3 is already installed. But for the sake of this tutorial I will go ahead and try to install an older version from the available list i.e. 3.10.6-1~22.04
sudo apt install python3=3.10.4-0ubuntu2 -y
But unfortunately the installation failed to unmet dependencies.
Step 4: Handling dependency conflicts (Optional)
If the last step was successful for you without any dependency conflicts then you can skip this step. In my case since I was trying to install old version of python3 package so it is expecting some more dependencies for that specific version.
The error basically means that when trying to install a specific version of Python 3 (python3=3.10.4-0ubuntu2
) on my Ubuntu system expects dependencies of the package (python3-minimal
and libpython3-stdlib
) which are expected to be of the same version as the package we are trying to install. However, the versions available or to be installed for these dependencies are newer (3.10.6-1~22.04
). This mismatch leads to a conflict that apt
cannot resolve automatically.
To resolve this, I will need to install the exact versions of the dependencies that are compatible with python3=3.10.4-0ubuntu2
. So let's try the same:
sudo apt install python3=3.10.4-0ubuntu2 python3-minimal=3.10.4-0ubuntu2 libpython3-stdlib=3.10.4-0ubuntu2 -y
But unfortunately I get some more dependency conflicts:
So this solution isn't working for me.
In such cases it is recommended to use aptitude for a more interactive resolution process:
sudo apt install aptitude
Ensure that you have all the appropriate repositories enabled, especially the "universe
" and "main
" repositories where different Python versions might reside:
sudo add-apt-repository universe
sudo apt update
Next go ahead and attempt to install python using aptitude with your specific version:
sudo aptitude install python3=3.10.4-0ubuntu2
This command will suggest multiple solution such as downgrading certain packages or even uninstalling conflicting packages.
The following NEW packages will be installed:
python3{b} python3.10{a} python3.10-minimal{a}
0 packages upgraded, 3 newly installed, 0 to remove and 27 not upgraded.
Need to get 22.8 kB/2,773 kB of archives. After unpacking 6,780 kB will be used.
The following packages have unmet dependencies:
python3 : PreDepends: python3-minimal (= 3.10.4-0ubuntu2) but it is not going to be installed
Depends: libpython3-stdlib (= 3.10.4-0ubuntu2) but it is not going to be installed
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) python3 [Not Installed]
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Install the following packages:
1) libpython3-stdlib [3.10.4-0ubuntu2 (jammy)]
2) python3-minimal [3.10.4-0ubuntu2 (jammy)]
Accept this solution? [Y/n/q/?] Y
The following NEW packages will be installed:
libpython3-stdlib{a} python3 python3-minimal{a} python3.10{a} python3.10-minimal{a}
0 packages upgraded, 5 newly installed, 0 to remove and 27 not upgraded.
Need to get 54.2 kB/2,805 kB of archives. After unpacking 6,945 kB will be used.
Do you want to continue? [Y/n/?] Y
Get: 1 http://in.archive.ubuntu.com/ubuntu jammy/main amd64 python3-minimal amd64 3.10.4-0ubuntu2 [24.4 kB]
Get: 2 http://in.archive.ubuntu.com/ubuntu jammy/main amd64 libpython3-stdlib amd64 3.10.4-0ubuntu2 [6,990 B]
Get: 3 http://in.archive.ubuntu.com/ubuntu jammy/main amd64 python3 amd64 3.10.4-0ubuntu2 [22.8 kB]
Fetched 54.2 kB in 1s (49.2 kB/s)
Selecting previously unselected package python3.10-minimal.
(Reading database ... 246497 files and directories currently installed.)
Preparing to unpack .../python3.10-minimal_3.10.12-1~22.04.3_amd64.deb ...
Unpacking python3.10-minimal (3.10.12-1~22.04.3) ...
Setting up python3.10-minimal (3.10.12-1~22.04.3) ...
(Reading database ... 246507 files and directories currently installed.)
Preparing to unpack .../python3-minimal_3.10.4-0ubuntu2_amd64.deb ...
Unpacking python3-minimal (3.10.4-0ubuntu2) ...
Preparing to unpack .../python3.10_3.10.12-1~22.04.3_amd64.deb ...
Unpacking python3.10 (3.10.12-1~22.04.3) ...
Preparing to unpack .../libpython3-stdlib_3.10.4-0ubuntu2_amd64.deb ...
Unpacking libpython3-stdlib:amd64 (3.10.4-0ubuntu2) ...
Setting up python3-minimal (3.10.4-0ubuntu2) ...
Selecting previously unselected package python3.
(Reading database ... 246552 files and directories currently installed.)
Preparing to unpack .../python3_3.10.4-0ubuntu2_amd64.deb ...
Unpacking python3 (3.10.4-0ubuntu2) ...
Setting up python3.10 (3.10.12-1~22.04.3) ...
Setting up libpython3-stdlib:amd64 (3.10.4-0ubuntu2) ...
Setting up python3 (3.10.4-0ubuntu2) ...
running python rtupdate hooks for python3.10...
running python post-rtupdate hooks for python3.10...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
Processing triggers for man-db (2.10.2-1) ...
W: APT had planned for dpkg to do more than it reported back (12 vs 21).
Affected packages: python3.10-minimal:amd64 python3:amd64
Current status: 30 (+3) upgradable.
As you can see, the aptitude command has given us the best possible solution to handle all dependency and still be able to install the specific version of python3 package.
Step 5: Verify Installation
Once the previous steps have completed successfully, use dpkg command to check the currently installed version of the package you were installing, in our case Python3
dpkg -l python3
Output:
So we have successfully installed Python with specific version using aptitude. Now in your case if you don't have any dependency conflicts then you just use apt
command as per the syntax I have shared in previous steps.