This is a common issue when you manually update your system's Python version.
Let's understand the problem:
When we install the python binding for apt (either python3-apt or python-apt), it places a shared object file within /usr/lib/python3/dist-packages
. It might look like this:
apt_pkg.cpython-310-x86_64-linux-gnu.so
Here, 310
is my python version, maybe your one will say 36m
python-3.6 or maybe 38
python-3.8
Now, most of the times you'll see just one old obj file in that location.
Say you had python 3.10 and you upgraded to 3.11. But inside /usr/lib/python3/dist-packages
you'll see
/usr/lib/python3/dist-packages ❯ ls -l | grep -i 'apt_pkg.c'
.rw-r--r-- 351k root 30 Nov 2022 apt_pkg.cpython-310-x86_64-linux-gnu.so
If you've been using the OS for a while, you might find more than one file:
/usr/lib/python3/dist-packages ❯ ls -l | grep -i 'apt_pkg.c'
.rw-r--r-- 351k root 30 Nov 2022 apt_pkg.cpython-310-x86_64-linux-gnu.so
.rw-r--r-- 351k root 30 Nov 2022 apt_pkg.cpython-39-x86_64-linux-gnu.so
Now, what's happening is, there's no new obj file to point to our latest python binary.
We could create a symlink from the existing old image to apt_pkg.so
. But since symlinks can be fragile and might break if the referenced file gets deleted, it's better to copy it directly as apt_pkg.so
.
doing,
sudo cp apt_pkg.cpython-310-x86_64-linux-gnu.so apt_pkg.so
will fix it. remember to put your image name there.
Now, if there are multiple old images, choose the closest to your python version
If there are apt_pkg.cpython-310-x86_64-linux-gnu.so
and apt_pkg.cpython-39-x86_64-linux-gnu.so
select apt_pkg.cpython-310-x86_64-linux-gnu.so
When copying, if you encounter something like
cp: failed to access '/usr/lib/python3/dist-packages/apt_pkg.so': Too many levels of symbolic links
Simply unlink apt_pkg.so
then run,
sudo cp apt_pkg.cpython-310-x86_64-linux-gnu.so apt_pkg.so
Thsi should fix it :)