Installing the Newest Version of Python 2.7.x on Older Ubuntu Systems
If you need to upgrade to the newest version of Python 2.7.x, and you're running an older distribution (like Ubuntu 14.04), use the following commands to get and compile the latest version from source (works on Ubuntu 17.04 and older – tested on Ubuntu 14.04):
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
version=2.7.18
cd ~/Downloads/
wget https://www.python.org/ftp/python/$version/Python-$version.tgz
tar -xvf Python-$version.tgz
cd Python-$version
./configure --with-ensurepip=install
make
sudo make install
Install requests and hashlib:
sudo rm /usr/lib/python2.7/dist-packages/chardet*.egg-info
sudo rm -r /usr/lib/python2.7/dist-packages/chardet
sudo rm /usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gnu.so
sudo rm /usr/lib/python2.7/lib-dynload/_hashlib.i386-linux-gnu.so
sudo pip install requests
sudo easy_install hashlib
You may need to create a symlink for chardet after installing it directly from pip:
ln -sf /usr/local/lib/python2.7/site-packages/chardet /usr/lib/python2.7/dist-packages/chardet
If you get the error of "ImportError: cannot import name _remove_dead_weakref" when running a pam python based authentication script after installing the new version of python, try this fix:
sudo cp /usr/local/lib/python2.7/weakref.py /usr/local/lib/python2.7/weakref_old.py
sudo cp /usr/lib/python2.7/weakref.py /usr/local/lib/python2.7/weakref.py
Getting Let's Encrypt Certbot to Work:
Now, you'll need to delete the EFF directory from the /opt directory to avoid old configuration issues that were used for your older version of python. Once you cleanup this directory, you'll run certbot again so it can reconfigure itself.
sudo rm -r /opt/eff.org/
sudo certbot
Old Way
jonathonf is now a very greedy person and has made his repositories private, so this method no longer works as of 12/20/2019.
sudo add-apt-repository ppa:jonathonf/python-2.7
sudo apt-get update
sudo apt-get install python2.7
Then, you'll need to cleanup a few leftover system packages manually before installing the newest version of python-pip. If you don't do this, you'll run into problems installing some new packages using pip.
sudo rm /usr/lib/python2.7/dist-packages/chardet*.egg-info
sudo rm -r /usr/lib/python2.7/dist-packages/chardet
sudo rm /usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gnu.so
sudo rm /usr/lib/python2.7/lib-dynload/_hashlib.i386-linux-gnu.so
Now, you can download and install the newest version of python-pip:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
Getting Let's Encrypt Certbot to Work:
First, you'll need to install a few packages that Certbot (the Let's Encrypt client) uses:
sudo pip install requests
sudo pip install hmac
Now, you'll need to delete the EFF directory from the /opt directory to avoid old configuration issues that were used for your older version of python. Once you cleanup this directory, you'll run certbot again so it can reconfigure itself.
sudo rm -r /opt/eff.org/
sudo certbot
You're done.
Full list of commands (for quickly doing all of the above):
sudo -i
add-apt-repository ppa:jonathonf/python-2.7
apt-get update
apt-get install python2.7
rm /usr/lib/python2.7/dist-packages/chardet*.egg-info
rm -r /usr/lib/python2.7/dist-packages/chardet
rm /usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gnu.so
rm /usr/lib/python2.7/lib-dynload/_hashlib.i386-linux-gnu.so
mkdir -p /root/Downloads
cd /root/Downloads
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip install requests
pip install hmac
rm -r /opt/eff.org/
certbot