
mod_python
Hace algún tiempo escribí un pequeño artículo sobre cómo instalar mod_python en Apache 2.2. El tema es que, lógicamente, cada tanto uno quiere actualizar Python para tener las últimas correcciones de bugs y los últimos features. En mi caso quería instalar Python 2.6.1 en un CentOS. El tema es que con yum no veía ninguna actualización, pero tenía Python 2.4.x instalado y yo quería lo último. Me bajé el código, lo compilé, lo instalé y al rato me di cuenta que al hacer eso había roto el yum (que está escrito en Python). Así fue que llegué a darme cuenta de cómo instalar Python 2.6.1 por separado, y recompilar mod_python para que trabaje con esa versión, y esto es lo que quería compartir con ustedes.
Primero: Instalar Python 2.6 en una ubicación alternativa
Lo primero que vamos a hacer es descargar, compilar e instalar Python 2.6 en una ruta alternativa, es decir, sin pisar la instalación actual de Python 2.4 que viene con CentOS.
# cd /usr/src # wget http://www.python.org/ftp/python/2.6.1/Python-2.6.1.tgz # tar zxvf Python-2.6.1.tgz # cd Python-2.6.1/ # ./configure --prefix=/usr # make # make altinstall
La clave está justamente en el último paso. En vez de hacer “make install”, hacemos “make altinstall” para que se instale sin sobreescribir la versión actual de Python. Básicamente lo que hace es instalar todas las libs en /usr/lib/python2.6 (esto lo hace de todas formas), y luego crear el binario /usr/bin/python2.6 pero sin sobreescribir /usr/bin/python.
Editado el 10/03/2010: En algunos casos puede ser necesario agregar al configure de Python la opción –enable-shared. Gracias Orcen!
Segundo: Recompilar mod_python
Ahora queda recompilar mod_python contra la nueva versión de python.
# cd /usr/src # wget http://www.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz # tar -zxvf mod_python-3.3.1.tgz # cd mod_python-3.3.1 # ./configure --with-python=/usr/bin/python2.6 # make # make install
La clave aquí está en el configure al que le pasamos el parámetro de qué binario de Python debe usar.
Tercero: Reiniciar Apache y probar
Por último queda reiniciar Apache y repetir la prueba explicada en el artículo anterior.
# service httpd restart
Hola! he seguido este How To pero no me servía en un principio, me daba un error al recompilar. Entonces intenté ver que sucedía si lo instalaba de una en lugar de hacer maket altinstall le di de una vez make install y he destruido por completo el yum… no me sirve y no se que hacer…
Te agradecería cualquier ayuda!!!
Saludos! Pura vida!!!
Te tenés que bajar el RPM de Python 2.4 e instalarlo reemplazando la versión que instalaste.
wget http://mirror.centos.org/centos/5/os/i386/CentOS/python-2.4.3-21.el5.i386.rpm
rpm -Uvh –replacefiles python-2.4.3-21.el5.i386.rpm
Gracias por contestar tan rápido, sin embargo lo he intentado pero me da un error 404 Not Found, no habrá algún otro sitio de donde se pueda descargar???
Salu2
Aca va el link actualizado:
http://mirror.centos.org/centos/5/os/i386/CentOS/python-2.4.3-24.el5.i386.rpm
me tira este error
[root@localhost src]# rpm -Uvh –replacefiles python-2.4.3-24.el5.i386.rpm
error: Error de dependencias:
libgdbm.so.2 se necesita para python-2.4.3-24.el5.i386
he intentado bajar esa lib pero a la hora de intentar instalar (soy un novato en esto, así que pido disculpas si hay cosas muy obvias que tal vez este haciendo mal) me da este otro error
[root@localhost Desktop]# rpm -Uvh gdbm-1.8.0-26.2.1.src.rpm
error: no se pudo crear %sourcedir /usr/src/redhat/SOURCES
¿Alguna idea?
Disculpá la demora en contestar.
Fijate los permisos de la carpeta /usr/src/redhat
A lo bestia lo podés resolver con:
chmod -R 777 /usr/src/redhat
y luego intentar de nuevo.
Saludos
Ya pude ejecutar el rpm, esto me desempaquetó todo en un tar.gz por lo que le hice:
[root@localhost gdbm-1.8.0]# tar -zxvf gdbm-1.8.0.tar.gz
ahora, por lo que he podido observar en este tiempo a eso habría que hacerle un ./configure; un ./make; y un ./make install
sin embargo no sé cuáles parámetros darle al configure, y si lo hago así no más no me sirve…
Saludos y muchas gracias por tomarte el tiempo para responder!!
mmm… para ver las opciones del configure podrías poner./configure –help
yo lo que probaría es hacer:
./configure –prefix=/usr
make
make install
ldconfig
este último comando es para actualizar la configuración de las librerías dinámicas
y después probar de nuevo con el rpm de python
y mientras tanto buscar en foros si a alguien le pasó lo mismo instalando python
lo intenté y este fue el resultado:
[root@localhost gdbm-1.8.0]# ./configure –prefix=/usr
loading cache ./config.cache
checking for gcc… gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler… no
checking whether we are using GNU C… yes
checking whether gcc accepts -g… yes
checking how to run the C preprocessor… gcc -E
checking for a BSD compatible install… /usr/bin/install -c
checking host system type… Invalid configuration `x86_64-unknown-linux-gnu’: machine `x86_64-unknown’ not recognized
checking for ranlib… ranlib
checking for ld used by GCC… /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld… yes
checking for BSD-compatible nm… /usr/bin/nm -B
checking whether ln -s works… yes
ltconfig: you must specify a host type if you use `–no-verify’
Try `ltconfig –help’ for more information.
configure: error: libtool configure failed
[root@localhost gdbm-1.8.0]# make
make: *** No se especificó ningún objetivo y no se encontró ningún makefile. Alto.
Ahh creo que ya sé cuál es el problema.
El configure se está pinchando porque no puede configurar libtool. Pero más allá de eso ahora caigo en que te bajaste el paquete gdbm-1.8.0-26.2.1.src.rpm
El “src” en el nombre quiere decir que trae los fuentes (para compilar). Fijate donde lo bajaste si no había otro que no dijera src y probá de instalar ese rpm así te ahorrás de compilarlo. Quizás este te sirva:
http://mirror.centos.org/centos/5/os/i386/CentOS/gdbm-1.8.0-26.2.1.i386.rpm
Y quizás también tengas que instalar este otro:
http://mirror.centos.org/centos/5/os/i386/CentOS/gdbm-devel-1.8.0-26.2.1.i386.rpm
Fijate que siempre los RPM vienen por ejemplo en este caso gdbm y gdbm-devel. Los “devel” (de development, desarrollo) son paquetes que incluyen librerías que te sirven cuando tenés que compilar otras cosas que linkeen contra ellas.
Saludos
Acabo de probar esto último y sirvió a la perfección (por lo menos así me parece)
[root@localhost src]# rpm -Uvh gdbm-1.8.0-26.2.1.i386.rpm
Preparando… ########################################### [100%]
1:gdbm ########################################### [100%]
[root@localhost src]# rpm -Uvh gdbm-devel-1.8.0-26.2.1.i386.rpm
Preparando… ########################################### [100%]
1:gdbm-devel ########################################### [100%]
[root@localhost src]# rpm -Uvh –replacefiles python-2.4.3-24.el5.i386.rpm
Preparando… ########################################### [100%]
1:python ########################################### [100%]
Y ahora que debo hacer para que el yum vuelva a funcionar si ya le instalé la antigua versión de python, porque lo he probado y sigue diciendo:
[root@localhost src]# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
No module named yum
Please install a package which provides this module, or
verify that the module is installed correctly.
It’s possible that the above module doesn’t match the
current version of Python, which is:
2.6.1 (r261:67515, Apr 6 2009, 03:43:40)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)]
If you cannot solve this problem yourself, please go to
the yum faq at:
http://wiki.linux.duke.edu/YumFaq
Y acabo de caer en cuenta que todavía reconoce la versión de python como la 2.6.1. ¿No hay que “decirle” que utilice la otra versión o algo parecido?
Fijate qué versión de python te tira si ponés:
python -V
Si es la 2.6 es porque o la 2.4 no se instaló o no se instaló sobre la 2.6. Con qué comando instalaste el rpm de python?
Me dice
[root@localhost src]# python -V
Python 2.6.1
pero yo utilicé el comando
[root@localhost src]# rpm -Uvh –replacefiles python-2.4.3-24.el5.i386.rpm
Preparando… ########################################### [100%]
1:python ########################################### [100%]
y pareció todo bien…
Probá con:
rpm -Uvh –force python-2.4.3-24.el5.i386.rpm
Y sino quizás este post te sirva:
http://www.centos.org/modules/newbb/viewtopic.php?forum=37&topic_id=17730
No sirvió, creo que lo que me queda es re-instalar centOS, pero cuando llegue al punto de instalar Python 2.6.1 si no me sirve me jor te pregunto por acá antes de ponerme a experimentar jeje.
Muchas gracias por tu tiempo y en un rato te molesto de nuevo
Hola ya volví al punto en que necesito Python 2.6.1, todo va bien pero cuando estoy recompilando me da un error, específicamente aquí:
# make
Me da este error
/usr/lib/python2.6/config/libpython2.6.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
apxs:Error: Command failed with rc=65536
.
make[1]: *** [mod_python.so] Error 1
make[1]: se sale del directorio `/usr/src/mod_python-3.3.1/src’
make: *** [do_dso] Error 2
Eso cuando compilás Python o mod_python?
mod_python
Probá recompilando Python agregando en el configure la opción –enable-shared
ok,
el configure lo puse así
# ./configure –enable-shared –prefix=/usr
y apenas le dí el #make me dio esto
Failed to find the necessary bits to build these modules:
_curses _curses_panel _hashlib
_sqlite3 _ssl _tkinter
bsddb185 bz2 dl
gdbm imageop readline
sunaudiodev zlib
To find the necessary bits, look in setup.py in detect_modules() for the module’s name.
running build_scripts
voy a darle #make altinstall a ver que hace
ahora mientras hacía el configure de mod_python me dio este error
checking for –with-python… /usr/bin/python2.6
checking Python version… /usr/bin/python2.6: error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory
/usr/bin/python2.6: error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory
configure: error: This version of mod_python only works with Python major version 2. The one you have seems to be .
Tengo una pregunta…
Si yo lo que necesito es Python2.6.1 para una aplicación específica que ocupa esa versión, es necesario que instale mod_python??? Es que estuve leyendo que era mod_python y entendí que es un módulo de apache para que éste pueda ejecutar código python.
Si yo lo que ocupo es que la aplicación “X” corra con python2.6.1 no le puedo decir a esta aplicación en el configure que se compile con el pyhton que esta compilado anteriormente aunque no tenga mod_python???
Ah acabáramos…
mod_python efectivamente es un módulo de apache que sirve para desarrollar sitios webs en Python.
Si no necesitás eso, entonces no necesitás mod_python.
Por lo demás, si ya pudiste instalar y compilar Python no necesitás nada más.
Ahora bien, la aplicación que tengas que usar dificilmente se compile (porque Python no se compila… bueno, en realidad se compila al momento de la ejecusión, pero para el caso es lo mismo). Lo que sí vas a tener que indicarle que se ejecute con otro binario de Python (no con el de /usr/bin/python porque ese seguramente sea el de Python 2.4).
Para ello fijate si tenés un archivo principal que ejecutes. Ese en la primer línea es posible que tenga una línea como esta:
#!/usr/bin/python
Que deberías cambiarla por la ruta del binario de Python 2.6, por ejemplo:
#!/usr/bin/python2.6
También podés probar ejecutando:
python2.6 /ruta/al/archivo.py
AHHHH bueno excelente noticia!!! muchísimas gracias por toda tu ayuda!!! Pura vida!!
Por nada, gracias por tus comentarios.
Hola Segui los pasos de instalacion de Python 2.6 y MOD Python, al hacer make
me da el siguinte eror:
File “”, line 1, in
AttributeError: ‘module’ object has no attribute ‘lib’
make[1]: *** [build] Error 1
make[1]: se sale del directorio `/usr/src/mod_python-3.3.1/dist’
make: *** [do_dso] Error 2
Que podria ser???
Por otro lado ya puse le od_python corriendo en mi apache, pero me toma el 2.4 en vez del 2.6 entonces no encuentra los modulos que necesito(especificamente estoy corriendo DJANGO)
Gracias por la ayuda
No tengo mucha idea de por qué te puede estar dando error en el make. Pusiste el configure con la ruta al binario de Python2.6? Ese binario funciona bien? Si lo ejecutás te abre la consola de Python sin problemas?
Puse tal cual indica en la seccion recompilar mod_python pero no pasa nada, es mas ahora al intentar resturar el apache me da el siguiente error:
Iniciando httpd: httpd: Syntax error on line 203 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/mod_python.so into server: /usr/lib/httpd/modules/mod_python.so: cannot restore segment prot after reloc: Permission denied
es decir estoy pero que al pincipio.
Este es el error que da al llamar la pagina:
Mod_python error: “PythonHandler django.core.handlers.modpython”
Traceback (most recent call last):
File “/usr/lib/python2.4/site-packages/mod_python/apache.py”, line 287, in HandlerDispatch
log=debug)
File “/usr/lib/python2.4/site-packages/mod_python/apache.py”, line 461, in import_module
f, p, d = imp.find_module(parts[i], path)
ImportError: No module named django
Pasa que mi modulo esta en python2.6/site-packages
Gracias por la rapida respuesta
Javier
Claro, ese error te lo da porque intentaste recompilar mod_python y se pinchó la compilación. Probaste ejecutar el binario de Python2.6 a ver si funciona bien?
Otra alternativa es instalar mod_wsgi que funciona mejor:
http://www.tail-f.com.ar/2010/02/14/servicios/httpd/apache-httpd-servicios/mod_wsgi-python-2-6-en-centos.html
Muy buen tutorial, me vino de maravilla. Como pequeña crítica constructiva, he tenido grandes problemas al querer compilar tanto mod_python como mod_wsgi, por algunos problemas con apxs. Lo solucioné luego de reinstalar python con –enable-shared, como bien dijiste en un comment, quizá podría resultar útil incluirlo en el tutorial?
Saludos!
Gracias por el dato, ahí lo edité.