mod_python + Python 2.6 en CentOS

mod_python

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
Bookmark and Share
Comentar

34 Comentarios.

  1. 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!!!

  2. elbarto andresgattinoni.com.ar

    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

  3. 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

  4. 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

  5. elbarto andresgattinoni.com.ar

    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

  6. 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!!

  7. elbarto andresgattinoni.com.ar

    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

  8. 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.

  9. elbarto andresgattinoni.com.ar

    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

  10. 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?

  11. elbarto andresgattinoni.com.ar

    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?

  12. 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…

  13. elbarto andresgattinoni.com.ar

    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

  14. 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

  15. 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

  16. elbarto andresgattinoni.com.ar

    Eso cuando compilás Python o mod_python?

  17. elbarto andresgattinoni.com.ar

    Probá recompilando Python agregando en el configure la opción –enable-shared

  18. 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

  19. 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 .

  20. 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???

  21. elbarto andresgattinoni.com.ar

    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

  22. AHHHH bueno excelente noticia!!! muchísimas gracias por toda tu ayuda!!! Pura vida!!

  23. elbarto andresgattinoni.com.ar

    Por nada, gracias por tus comentarios.

  24. 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

  25. elbarto andresgattinoni.com.ar

    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?

  26. 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

  27. elbarto andresgattinoni.com.ar

    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

  28. 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!

  29. elbarto andresgattinoni.com.ar

    Gracias por el dato, ahí lo edité.

Comentar


[ Ctrl + Enter ]

Trackbacks y Pingbacks: