J’ai la vieille habitude de bosser sur CentOS pour des raisons personnelles absolument infondées et grotesques mais les habitudes ont la vie dure comme on dit.
Et ainsi va la vie, qui évolue au fil du temps, et python aussi, et les apps aussi, et un jour il faut pour des raisons de vie ou de mort passer à une version plus récente de Python.
Sam a tenté cette folie il y a quelques temps, avec comme seules réserves un pot de glace ben&jerry et un ouvre-boîte à bouteilles. Bien mal lui en a pris, il a passé des heures sur le serveur, a tout pété et a fini sous exomil.
Suite à ça je n’ai jamais osé tenter le coup jusqu’à hier, en tombant sur cet article que je me propose de vous traduire.
CentOS 6.x vient avec Python 2.6.6, si vous tentez une mise à jour comme ça par des paquets ou en compilant les sources sans faire attention vous risquez de tout péter, car Yum utilise python lui aussi, mais la 2.6.6.
Je précise que le tuto à la base est pour CentOS 6.3 et Python 2.7.3 et que moi j’ai testé Python 2.7.5 sur CentOS 6.5, je pense donc que c’est bon pour à peu près toutes les versions voisines.
L’astuce consiste à compiler la nouvelle version de Python et de l’installer en tant que version alternative sans désinstaller celle présente sur le serveur.
Les paquets nécessaires:
yum groupinstall "Development tools" yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel |
On télécharge la version de Python à installer, pour ma part c’était Python 2.7.5 pour pouvoir utiliser opencv. Normalement les autres versions devraient passer aussi.
cd /opt wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2 --no-check-certificate tar xvf Python-2.7.5.tar.bz2 cd Python-2.7.5 ./configure --prefix=/usr/local --enable-shared make && make altinstall |
ATTENTION! Deux choses à ne pas oublier:
–enable-shared: Certaines applications (comme opencv) ont besoin d’avoir accès à des librairies partagées d’autres applications, c’est le fameux fichier libpython2.7.so qui fait merder vos compilations 1 fois sur deux, si si rappelez-vous…
altinstall: ne pas utiliser install mais bien altinstall. install va écraser votre installation actuelle de python (2.6.6) et tout péter. altinstall va installer votre nouvelle version de python dans un autre répertoire.
Si tout s’est bien passé vous devriez avoir 2 versions de Python à présent.
La version système 2.6.6 et la version 2.7.x dans /usr/local/bin/python2.7.
Vous pouvez faire un lien symbolique pour mettre la 2.7.x par defaut:
ln -s /usr/local/bin/python2.7 /usr/local/bin/python |
Verifions que tout est ok:
[pina@colada ~]# python Python 2.7.5 (default, Feb 8 2014, 06:51:01) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> |
Chez moi ça marche! Yeahhh baby!
Cadeau BONUX! Installation de easy_install et PIP:
Pour finir on va mettre en place le fameux PIP afin de pouvoir ultérieurement installer des apps.
cd /opt wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.27.tar.gz tar xf distribute-0.6.27.tar.gz --no-check-certificate cd distribute-0.6.27 python2.7 setup.py install |
Normallement vous devriez avoir un chemin easy_install version 2.7 pour votre nouvelle version Python2.7 du genre /usr/local/bin/easy_install-2.7
Faites un test:
[pina@colada ~]# ls -ltr /usr/local/bin/easy_install* -rwxr-xr-x 1 root root 340 8 févr. 06:04 /usr/local/bin/easy_install-2.7 -rwxr-xr-x 1 root root 332 8 févr. 06:04 /usr/local/bin/easy_install |
Installons PIP:
easy_install-2.7 pip |
Et testons PIP:
pip install numpy
[pina@colada ~]# python Python 2.7.5 (default, Feb 8 2014, 06:51:01) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import numpy >>> numpy.__version__ '1.8.0' >>> |
Et c’est parti pour des heures de code afin de conquérir le monde !
La semaine prochaine nous verrons comment faire bouillir des lutins sans que la peau se décolle.
Si tu changes le lien symbolique de python, ça casse pas yum ?
On a CentOS sur les serveurs de calcul au boulot, c’est peut-être stable mais c’est des sacrément vieilles versions. Et ça casse les couilles de tomber sur un bug résolu en 2010 (c’était dans matplotlib) ! Je code aussi régulièrement des trucs en python2.7/python3 pour m’apercevoir que c’est pas compatible python2.6. Et encore, y’a pas un an on était en Centos5 avec python 2.4…
La 2.7 peut faire tourner du code 2.6.
@kontre
Chez moi ça casse rien, ceci dit si tu as peur de tout casser ne modifie pas le lien symbolique.
test d’un yum après une installation de python 2.7.5
http://goo.gl/5kFlMh
YUM ne doit pas se servir du bin python mais plutôt de ses libs ( supposition basée sur rien du tout à part l’intuition) :)
@Sam: Pas tout à fait, puisque ça casse yum justement…
@kontre : qu’est-ce qui te fait dire que ça casse Yum ?
ben :
ainsi que différentes recherches google à l’époque où j’avais regardé la faisabilité du truc. C’est bien pour ça que tu indiques de faire une altinstall, non ?
Oui mais le problème vient pas de l’incompatibilité entre 2.7 et 2.6, ça vient avec le fait qu’installer incorrectement les deux fout le bordel.
Par exemple, si tu as la moitié des libs en 2.6 et en 2.7, ça merdouille. Ou si tu nique des liens symboliques et autre.
Ah ok, pigé. Du coup je testerai peut-être, merci !
Bonjour,
la solution décrite n’est pas la plus simple.
Le plus simple et la plus efficace c’est d’utiliser le dépot “Software Collections”
Parmis les soft, vous trouverez 2 versions supplémentaires de python (2,7 et 3,3)
Pour l’install sous centos du dépot regardez sur le wiki de la distrib.
J’ai pas de Centos mais our résumer après les 3 commandes suivantes vous travaillerez avec un python-2.7 sans souci pour le reste de la distrib :
yum install centos-release-SCL
yum install python27
scl enable python27 bash
@gmat
thx pour l’info, ça a l’air pas mal en effet, j’ai encore 3 serveur à “upgrader” en python 2.7, je vais tester ça
Lorsque je fais un lien symbolique pour changer la version par defaut de python, rien ne change et par la suite rien ne fonctionne aprés
@Mnarios : http://sametmax.com/ceci-nest-pas-une-pipe/
Cool, merci : je viens de tester ça sur une Centos 6.6 et j’ai même pas encore enlevé les doigts de mon nez :)
Un tout petit ajout à ce merveilleux tuto : il a fallu que je renseigne le chemin de ma libpython (ld.so.conf) sinon ça voulait pas.
Bonne continuation.
Hello,
I think the second line should be:
"yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel"
.Also on CentOS 6.6,
/usr/local/lib
was not in the load path by default, I had to create a file in:/etc/ld.so.conf.d/
then runldconfig
.Cheers,
Christophe.
@Christophe
Could you tell us more aubout your .conf file created in /etc/ld.so.conf.d/ : name and content ?
Thanks
Pascal
You can choose whatever name you wish under the
.d
dir. I have created alocal.conf
file:/etc/ld.so.conf.d/
├── local.conf
├── mysql-x86_64.conf
└── vmware-tools-libraries.conf
which contains just one line:
/usr/local/lib
Then you need to run
ldconfig
.Hope it’ll help.
Cheers,
Christophe.
@Christophe
Not only it has helped, but now it works :)
Many thanks Christophe !
Pascal
une petite mise à jour de mon commentaire précédent.
Le projet scl s’est bien développé. Il existe maintenant un site pour référencer les collections :
https://www.softwarecollections.org/en/
Ainsi toutes les distributions type RedHat peuvent bénéficier facilement des collections mises à la disposition dessus.
Parmi les dernières, une nous intéresse particulièrement ici c’est celle qui nous fournit la version 3.4 de python (enfin). Elle est disponible pour les versions 6 et 7. Certaines collections prennent en charge la version 5 mais elles se font rares.
Toutes les instructions pour l’installer et l’utiliser rapidement sont dispo en ligne :
https://www.softwarecollections.org/en/scls/rhscl/rh-python34/
Cool. RT.
Personne n’a remarqué depuis tout ce temps mais il manque le mot “install” dans la première commande. “yum install” :)
merci pour le tuyau, par contre ne pas oublier d’utiliser ucs-4 pour builder python (ucs-2 est utilisé par défaut) sous peine de se retrouver avec des erreurs mémoire incompréhensibles (cf ce lien)
ca donne
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared