Last active
January 30, 2023 21:49
-
-
Save niranjv/f80fc1f488afc49845e2ff3d5df7f83b to your computer and use it in GitHub Desktop.
Install Python 3.6 in Amazon Linux
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# A virtualenv running Python3.6 on Amazon Linux/EC2 (approximately) simulates the Python 3.6 Docker container used by Lambda | |
# and can be used for developing/testing Python 3.6 Lambda functions | |
# This script installs Python 3.6 on an EC2 instance running Amazon Linux and creates a virtualenv running this version of Python | |
# This is required because Amazon Linux does not come with Python 3.6 pre-installed | |
# and several packages available in Amazon Linux are not available in the Lambda Python 3.6 runtime | |
# The script has been tested successfully on a t2.micro EC2 instance (Root device type: ebs; Virtualization type: hvm) | |
# running Amazon Linux AMI 2017.03.0 (HVM), SSD Volume Type - ami-c58c1dd3 | |
# and was developed with the help of AWS Support | |
# The steps in this script are: | |
# - install pre-reqs | |
# - install Python 3.6 | |
# - create virtualenv | |
# install pre-requisites | |
sudo yum -y groupinstall development | |
sudo yum -y install zlib-devel | |
sudo yum -y install openssl-devel | |
# Installing openssl-devel alone seems to result in SSL errors in pip (see https://medium.com/@moreless/pip-complains-there-is-no-ssl-support-in-python-edbdce548852) | |
# Need to install OpenSSL also to avoid these errors | |
wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2l.tar.gz | |
tar -zxvf OpenSSL_1_0_2l.tar.gz | |
cd openssl-OpenSSL_1_0_2l/ | |
./config shared | |
make | |
sudo make install | |
export LD_LIBRARY_PATH=/usr/local/ssl/lib/ | |
cd .. | |
rm OpenSSL_1_0_2l.tar.gz | |
rm -rf openssl-OpenSSL_1_0_2l/ | |
# Install Python 3.6 | |
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz | |
tar xJf Python-3.6.0.tar.xz | |
cd Python-3.6.0 | |
./configure | |
make | |
sudo make install | |
cd .. | |
rm Python-3.6.0.tar.xz | |
sudo rm -rf Python-3.6.0 | |
# Create virtualenv running Python 3.6 | |
sudo pip install --upgrade virtualenv | |
virtualenv -p python3 MYVENV | |
source MYVENV/bin/activate | |
python --version | |
# Python 3.6.0 |
Here's an easy copy-paste install script for Python 3.6.12 on the default Amazon Linux 2 EC2 instance, based on the replies above.
sudo yum -y groupinstall development
sudo yum -y install zlib-devel
sudo yum -y install openssl-devel bzip2-devel
sudo yum remove python
curl -O https://www.python.org/ftp/python/3.6.12/Python-3.6.12.tgz
tar xzvf Python-3.6.12.tgz
cd Python-3.6.12
sudo ./configure --enable-optimizations --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
sudo make install
Then run Python3 with:
python3
And use pip with:
python3 -m pip
Thank you so much !
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
There is an
amazonlinux
container available with tags for 2018xxxx (Amazon Linux 1) and the default/latest points to Amazon Linux 2 I believe.You can enable
epel
for the amazonlinux container using theamazon-linux-extras install epel
and then when youyum install
things oryum search
it should be able to access most things fromepel
as well.If you are doing this in Docker for a deployable "builder" you probably don't want to use
yum install @development
as that pulls in a huge amount of packages (123 when I just ran it, weighing in at 121mb downloaded and ~141mb installed according to an uninstall, whilegit
seems to pull in about half of these, there are quite a few other likely unused packages as well). Using@development
oryum groupinstall development
might be less tedious if you are in hurry than honing in on only the packages you need to compile Python and/or native extensions by fixing failures one at a time.Personally I'm both lazy and OCD so I've gotten tired of handling the various quirks as new Python versions come out and just use Pyenv to install different versions of Python than what are available in the official repositories (on many distros and macOS and Windows).
Sadly it appears in our specific use case we ended up needing to use
centos:7
for our base image because the version ofgcc
coming fromamazonlinux
was having issues compiling our code where thecentos:7
version worked consistently.Skeleton of an AmazonLinux Dockerfile, can basically swap out the first 3 lines of the
centos
version with this and get a similar result.