Construire Python avec le support SSL dans un emplacement non standard
j'ai besoin d'installer plusieurs modules Python sur un RHEL où je n'ai pas d'accès root. Au moins un des modules doit aussi avoir accès à Python.h
.
Dans ce cas, je trouve que la meilleure chose à faire est d'installer python et dépendances ~/local
. Cela ne fait généralement que fonctionner, mais cette fois Python ne parvient pas à construire le module SSL (voir les détails ci-dessous). Voici la trace de ce que je fais.
donc j'ai téléchargé python 6 source et off I
./configure --prefix=/home/fds/rms/local
make >& make.log
une inspection à log révèle que le module ssl n'a pas été compilé, mais il n'y a aucune mention de la cause (aucune autre occurrence de ssl dans make ou configure):
Failed to find the necessary bits to build these modules:
_bsddb _curses _curses_panel
_hashlib _sqlite3 _ssl <----------
donc je me suis dit, python ne trouve aucune bibliothèque ssl du tout (ce qui est étrange, mais hey...). Donc je télécharge openssl-0.9.8 r et
./config --prefix=/home/fds/rms/local shared
make
make install
maintenant retour à Python, I./configurer et faire à nouveau. Il échoue, mais, cette fois, c'est différent:
Failed to build these modules:
_hashlib _ssl
un examen plus attentif du fichier journal révèle ceci:
gcc -pthread -shared build/temp.linux-x86_64-2.6/home/fds/rms/installers/Python-2.6.6/Modules/_ssl.o -L/home/fds/rms/local/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.6/_ssl.so
*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
donc maintenant il est ramasser la bibliothèque mais pas tout à fait à droite (le fichier est là où est devrait être):
$ find /home/fds/rms/local -iname libssl.so.0.9.8
/home/fds/rms/local/lib/libssl.so.0.9.8
la prochaine chose est de tracer la marque et voir où est-ce qu'il cherche le fichier:
$ strace -f make 2>&1 | grep libssl.so.0.9.8
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming "_ssl" sin"..., 131*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming "_hashlib""..., 135*** WARNING: renaming "_hashlib" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
Mhhh, il regarde dans tous les mauvais endroits. J'essaie de donner un indice:
CPPFLAGS="-I/home/fds/rms/local/include -I/home/fds/rms/local/include/openssl" LDFLAGS="-L/home/fds/rms/local/lib" ./configure --prefix=/home/fds/rms/local
mais rien ne change, et make
ne semble pas essayer /home/fds/rms/local/lib
du tout.
Je n'ai pas fait ça depuis des années, donc peut-être que j'oublie quelque chose. N'importe qui peut aider avec ce problème?
Merci d'avance.
8 réponses
vous devez éditer Modules/Setup.dist
pour spécifier L'emplacement D'OpenSSL si elle n'est pas dans l'emplacement standard. De obtenir le Support SSL en Python 2.5.1 :
si vous vous trouvez sur une machine linux ayant besoin du support ssl en python (pour utiliser un client dans des choses comme httplib.HTTPSConnection ou imaplib.IMAP4_SSL), alors laissez - moi vous épargner quelques heures de chasse autour du web (bien sûr, si vous avez trouvé ce qui signifie tu as déjà fait de la chasse au niveau!).
vous saurez si vous avez besoin du support ssl compilé dans votre python installation si vous recevez le message d'exception suivant: AttributeError: l'objet 'module' n'a pas d'attribut 'ssl'
pour que tu puisses continuer à t'élancer code python, vous devez d'abord vous assurer que vous avez OpenSSL installer. Par défaut, il est installé à partir de la source: / usr / local / ssl
si ce répertoire n'existe pas, saisissez le paquet source.
Ne le standard:
tar zxf openssl-0.9.8g.tar.gz cd openssl-0.9.8g ./config make make install
puis saisissez les sources python pour 2.5.1 et: tar zxf Python-2.5.1.tgz && cd Python-2.5.1
ensuite, vous devez éditer les Modules/Setup.dist:
204:# Socket module helper for SSL support; you must comment out the other 205:# socket line above, and possibly edit the SSL variable: 206:SSL=/usr/local/ssl 207:_ssl _ssl.c \ 208: -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ 209: -L$(SSL)/lib -lssl -lcrypto
si vous avez installé OpenSSL dans les emplacements par défaut, vous pouvez juste lignes 206-209, puis:
./configure make make install
vérifiez ensuite votre installation avec:
python /usr/local/lib/python2.5/test/test_socket_ssl.py test_rude_shutdown ... test_basic ... test_timeout ...
dans le Bourne shell (/bin/sh ou /bin/bash):
$ LD_LIBRARY_PATH=/usr/local/lib
$ export LD_LIBRARY_PATH
$ make
dans le réservoir en C (/bin /csh ou/bin / tcsh):
% setenv LD_LIBRARY_PATH /usr/local/lib
% make
pour moi éditant Modules/Setup
n'était pas suffisant car le module _hashlib
a fini par utiliser la mauvaise version D'OpenSSL; et LD_LIBRARY_PATH
n'a pas été pris en compte lors de l'exécution sur mon système SLES.
ce qui a fonctionné était de lier statiquement L'OpenSSL local à la fois _ssl
et _hashlib
en éditant setup.py
comme dans patch GitHub: eddy-geek/ python_custom_openssl.diff , puis make clean && make
.
plus détails sur la raison pour laquelle j'ai utilisé des liens statiques sur le débordement de la pile à Coredump lors de la compilation de python avec une version openssl personnalisée .
voici le processus complet que j'ai utilisé avec Python 2.7.11.
in top level Python2.7.Source dir:
-
Changement
Modules/Setup.dist
,Modules/Setup
: Commentaire "151930920 de la section" commentaire_socket
(no-op si c'est déjà commenté), décommentez et configurer SSL de manière appropriée (chemin d'accès à votre nouveau ssllib/includes
etc.)Note: le fichier Modules/Setup N'existe pas au début, mais après la première exécution, il obtient le contenu des Modules / Setup.dist je crois. Assurez-vous que les changements sont reflétés ici avant chaque course.
-
appliquer le correctif: http://gist.github.com/eddy-geek/9604982 (make distclean si, auparavant, a couru faire)
./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared # modify: Makefile -> set svnversion to "" make make altinstall
j'ai un ensemble de deux patches pour static openssl et static libintl pour 2 et 3 ci-dessous.
pour openssl (premier patch), vous devez définir L'OPENSSL_ROOT env var.
basé sur le patch de http://gist.github.com/eddy-geek/9604982 .
Pour Python 2.7.14:
https://gist.github.com/rkitover/2d9e5baff1f1cc4f2618dee53083bd35
https://gist.github.com/rkitover/afab7ed3ac7ce1860c43a258571c8ae1
Pour Python 3.6.3:
https://gist.github.com/rkitover/93d89a679705875c59275fb0a8f22b45
https://gist.github.com/rkitover/b18f19eafda3775a9652cc9cdf3ec914
j'obtenais le même résultat jusqu'à ce que je revienne aux logs pour openssl. Là j'ai vu que vous devez utiliser-fPIC lors de la construction openssl: extension du bâtiment "_ssl":
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/ssl/include -I. -IInclude -I./Include -I/usr/local/include -I/home/feramos/Python-2.7.3/Include -I/home/feramos/Python-2.7.3 -c /home/feramos/Python-2.7.3/Modules/_ssl.c -o build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o -L/usr/local/ssl/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.7/_ssl.so
/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile with -fPIC
openssl-0.9.8g]# .config -fPIC
puis, make, make install pour openssl et puis build Python à nouveau.
je construis Python2.7.13 et je vois cette même question. Pour 2.7.13 vous devez utiliser " openssl1.0.0 E" ou plus pour que ça marche. J'ai essayé openssl-0.9.8 g et ça ne marche pas. Et d'une façon ou d'une autre, je ne peux pas le faire fonctionner en modifiant les Modules/la configuration.dist donc je dois compiler manuellement ce _ssl.o. Je suppose que c'est parce qu'openssl-0.9.8 g que j'ai fourni ne fonctionne pas et qu'il a cherché libssl par défaut.alors?10 ce qui ne marche pas non plus.
essayez d'ajouter -Wl,-rpath,/home/fds/rms/local/lib
à LDPATH
.