Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

febrero 13, 2011

mod_wsgi apuntando a la versión correcta de python

mod_wsgi no carga correctamente las librerias de trac, en mi sistema lo tengo instalado en la versión 2.6, este es el error exacto:

mod_wsgi (pid=14804): Target WSGI script '/home/proyectos/trac/miproyecto-deploy/cgi-bin/trac.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=14804): Exception occurred processing WSGI script '/home/proyectos/trac/miproyecto-deploy/cgi-bin/trac.wsgi'.
Traceback (most recent call last):
  File "/home/proyectos/trac/miproyecto-deploy/cgi-bin/trac.wsgi", line 19, in 
    from trac.web.main import dispatch_request
ImportError: No module named trac.web.main

Si observamos a donde apunta el modulo wsgi, vemos que es a la versión 2.6:
# ldd mod_wsgi.so
        linux-vdso.so.1 =>  (0x00007fffc0bff000)
        libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00007f80b8511000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007f80b82f6000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007f80b80f1000)
        libutil.so.1 => /lib/libutil.so.1 (0x00007f80b7eee000)
        libm.so.6 => /lib/libm.so.6 (0x00007f80b7c6d000)
        libc.so.6 => /lib/libc.so.6 (0x00007f80b7924000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f80b8acc000)

Como esto no cuadra mucho editamos /home/proyectos/trac/miproyecto-deploy/cgi-bin/trac.wsgi añadiendo al principio:

import sys
f=open('/tmp/debug','wb')
f.write('sys.prefix: %s\n' % str(sys.prefix))
f.write('sys.path: %s\n' % str(sys.path))
f.close()

Esto nos crea un archivo donde vemos en realidad de donde está importando las librerías a las que llamamos:

# cat /tmp/debug
sys.prefix: /usr
sys.path: ['/usr/lib64/python25.zip', '/usr/lib64/python2.5', '/usr/lib64/python2.5/plat-linux2', '/usr/lib64/python2.5/lib-tk', '/usr/lib64/python2.5/lib-dynload', '/usr/lib64/portage/pym', '/usr/lib64/python2.5/site-packages']

Como vemos realmente está buscando en la versión 2.5... echando un vistazo a la config de apache vemos por donde puede venir el problema:

LoadModule python_module      modules/mod_python.so
LoadModule wsgi_module        modules/mod_wsgi.so

Tras un poco de investigación el problema es que primero se carga el modulo mod_python linkado contra la 2.5, así que recompilar mod_python contra la 2.6 y funcionando :)

octubre 26, 2008

msnp.py: protocolo MSN en python

He estado probando el msnp.py, una librería que implementa el protocolo de MSN (messenger) en python, genial para hacer bots o scripts que se comuniquen mediante chat: tutorial msnp.py

Al tema de la documentación le falta bastante, pues solo están comentadas las funciones básicas, conexión y chat, así que tirando de los detalles del protocolo comento el tema de añadir y eliminar usuarios, para poder automatizarlo y tal, la info está sacada de la guía del protocolo MSN messenger:

Existen cuatro listas personales, tres controlan nuestros contactos y una cuarta nos informa que usuarios nos tienen agregados (quieren saber de nuestra presencia online).
  • Forward List (FL): Nuestra lista de contactos, usuarios de los que queremos conocer cuando están online.

  • Reverse List (RL): Lista de usuarios que nos tienen en su lista FL (están suscritos a nuestra presencia), esta lista no es modificable, solo podemos consultarla.

  • Allow List (AL): Lista de usuarios a los que permites que te vean online. Podemos eliminar a un usuario de nuestra lista de contactos (FL) y mantenerlo en la AL, si en un futuro lo agregaramos de nuevo inmediatamente nos vería, así es como funciona un cliente de messenger normal. Si habéis trasteado por las opciones habréis visto usuarios permitidos que ya no teníais entre los contactos.

  • Block List (BL): Lista de bloqueados, usuarios que especificamente no quieres que vean tu presencia a pesar de que los mantenienes agregados (lista FL).


Cuando un usuario te agrega en su cliente nosotros recibimos una actualización de nuestra lista de contactos (.sync_friend_list()) en la que aparecerá el nuevo contacto en nuestra lista RL. A partir de aquí podemos ignorar a este nuevo usuario, el se suscribe a nuestra presencia, pero no recibirá información alguna nuestra. O bien podemos añadirle a nuestras listas, para ello debemos introducirlo en nuestra lista FL y permitir que nos vea añadiendolo a la lista AL.
Para bloquearlo abría que cambiarlo de la lista AL a la lista BL, y si ya no queremos tenerlo más lo quitamos de la lista FL, adicionalmente lo podemos quitar de las listas AL y BL.

mayo 24, 2008

Funny python

Cuando no es lo mismo '%i' % 5*5 que '%i' % (5*5)

Casi me vuelvo loco buscando por que las peticiones no se completaban... se quedaban como colgadas, yo pensando que era cosa del mod_python hasta que el bendito telnet me dio la pista:

req.headers_out.add('Cache-Control', 'max-age=%i' % 5*24*60*60)

.....
x-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max
-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-
age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-a
ge=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-ag
e=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age
=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=
5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5
max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5m
ax-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5ma
x-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max
-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-
age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-a
ge=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-ag
e=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age
=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=
5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5
max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5m
ax-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5ma
x-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max
-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-
age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-a
ge=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-ag
e=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age
=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=
5max-age=5max-age=5max-age=5max-age=5max-age=5max-age=5
Transfer-Encoding: chunked
Content-Type: httpd/unix-directory

12
zzzzzzzzzzzzzzzzzz
0


Poniendo los paréntesis correctos:
req.headers_out.add('Cache-Control', 'max-age=%i' % (5*24*60*60))

HTTP/1.1 200 OK
Date: Sat, 24 May 2008 11:15:35 GMT
Server: Apache/2.0.63 (Unix) mod_python/3.3.1 Python/2.5.2
Cache-Control: max-age=432000
Transfer-Encoding: chunked
Content-Type: httpd/unix-directory

12
zzzzzzzzzzzzzzzzzz
0

Una locura...

noviembre 12, 2007

Extraer la información binaria de un blob con python

Normalmente (según la versión de mysqlpy) la información de los blobs se entrega como array.array siendo necesario el uso de .tostring() sobre el array para recuperarlo.

Por ejemplo: cPickle.loads(blob.tostring())