python - tutorial - para que se usa elastic search
¿Cómo compilo Python 3.4 con OpenSSL personalizado? (3)
Tengo mi propia instalación de OpenSSL en una ubicación no estándar ( /my/path
por el bien de este ejemplo) y quiero que Python 3.4 se compile con eso cuando lo compilo en la fuente. Lo que intenté es esto (directorios abreviados)
CPPFLAGS="-I/my/path/include -I/my/path/include/openssl" ./configure --prefix=/my/path/
También probé con C_INCLUDE_PATH
y rutas separadas por dos puntos.
Entonces, corro make
y obtengo esto:
building ''_ssl'' extension
gcc -pthread -fPIC -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I./Include -I. -IInclude -I/my/path/include -I/my/path/include/openssl -I/usr/local/include -I/my/path/Python-3.4.0/Include -I/my/path/Python-3.4.0 -c /my/path/Python-3.4.0/Modules/_ssl.c -o build/temp.linux-x86_64-3.4/my/path/Python-3.4.0/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-x86_64-3.4/my/path/Python-3.4.0/Modules/_ssl.o -L/my/path/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-3.4/_ssl.cpython-34m.so
*** WARNING: renaming "_ssl" since importing it failed: build/lib.linux-x86_64-3.4/_ssl.cpython-34m.so: undefined symbol: SSL_get0_next_proto_negotiated
Está buscando SSL_get0_next_proto_negotiated
, pero eso está definido:
$ grep SSL_get0_next_proto_negotiated /my/path/include/openssl/*
/my/path/include/openssl/ssl.h:void SSL_get0_next_proto_negotiated(const SSL *s,
No estoy seguro de lo que estoy haciendo mal, ¿alguna idea?
Así lo resolví en 3.4. Es aplicable para 2.7 y 3.4. Lo importante es --with-ssl config argumento en ./configure:
wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
tar -xf Python-3.4.3.tgz
cd Python-3.4.3/
sudo yum install gcc
./configure --with-ssl
make && make install
# If you like to live dangerously since this will overwrite default python executable
make && make altinstall
# Safer because you access your new Python using python3.4
Gracias a @ScottFrazer por su respuesta. Me salvó un montón de problemas.
Aquí hay un script que utilicé en ubuntu para compilar python con la openssl 1.0.2g
más reciente de openssl 1.0.2g
.
# new openssl install
curl https://www.openssl.org/source/openssl-1.0.2g.tar.gz | tar xz && cd openssl-1.0.2g && ./config shared --prefix=/usr/local/ && make && make install
# Python install script
export LDFLAGS="-L/usr/local/lib/"
export LD_LIBRARY_PATH="/usr/local/lib/"
export CPPFLAGS="-I/usr/local/include -I/usr/local/include/openssl"
apt-get update
apt-get install build-essential checkinstall -y
apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev -y
cd /home/web/
wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz | tar xzf Python-2.7.11.tgz && cd Python-2.7.11
./configure --prefix=/usr/local/
make altinstall
Tenga en cuenta que la instalación es una instalación alternativa, lo que significa que no anulará el python predeterminado en ubuntu. Para verificar que la instalación fue exitosa:
/usr/local/bin/python2.7
>>> import ssl
>>> ssl.OPENSSL_VERSION
''OpenSSL 1.0.2g 1 Mar 2016''
Me las arreglé para averiguarlo después de tirar un montón de pelo. Fue un montón de variables de entorno ... Creo que podría haber hecho un poco de exageración, pero esto básicamente funcionó:
# OpenSSL 1.0.1g
./config shared --prefix=/my/path --openssldir=/my/path/openssl
make
make install
# Python 3.4
export LDFLAGS="-L/my/path/lib/ -L/my/path/lib64/"
export LD_LIBRARY_PATH="/my/path/lib/:/my/path/lib64/"
export CPPFLAGS="-I/my/path/include -I/my/path/include/openssl"
./configure --prefix=/my/path/
make
make install