lunes, 28 de septiembre de 2009

Error Python: 'module' object has no attribute 'AF_INET' en socket.py

Como conté antes, estoy aprendiendo Python para una materia de la Universidad y , la verdad que en general, creo que me voy enamorando de algunas de las ya conocidas bondades del lenguaje pero tiene sus secretillos, como todas las demás... :)
La historia empieza cuando quise correr el típico ejemplo de sockets en Python al que llamé, obviamente, socket.py.
El ejemplo es un pequeño cliente/servidor orientado a la conexión que hace una implementación del protocolo echo donde el servidor le replica al cliente un mensajito enviado por este:

#Código correspondiente al servidor
#==================================
import socket

host = 'XXX.XXX.X.X'  # IP o Hostname donde escucha
port = 3500   # Puerto de escucha, se recomienda un efímero
bytes = 1024   # Cantidad maxima de bytes a aceptar

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port)) # Indicamos al socket la direccion IP y Port de escucha
while 1:
    client, address = s.accept()  # Acepta las conexiones   
    data = client.recv(bytes)  # Se obtienen los datos desde el sock cliente 
    print "Conexion desde: %s:%i" %(address[0],address[1])
    if data:
        client.send(data)   # Enviamos el echo al cliente 
    client.close()     # Cerramos el sock cliente



#Código correspondiente al cliente
#=================================
import socket

host = 'XXX.XXX.X.XXX'
port = 3500
bytes = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send('Datos a enviar')
data = s.recv(bytes)
s.close()
print 'Echo de los datos enviados: ', data 


Este codigo no es mio ni mucho menos y se puede encontrar en cualquier rincón de la web que trate de sockets pero la anecdota es que cuando fui a hacer el "python socket.py" para correr el servidor me dió el siguiente error:

Traceback (most recent call last):
  File "socket.py", line 7, in 
    import socket
  File "/home/juan/Escritorio/Python/TP3/ejercicio1/socket.py", line 15, in 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AttributeError: 'module' object has no attribute 'AF_INET'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/apport_python_hook.py", line 38, in apport_excepthook
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python2.5/site-packages/apport/__init__.py", line 1, in 
    from apport.report import Report
  File "/usr/lib/python2.5/site-packages/apport/report.py", line 14, in 
    import subprocess, tempfile, os.path, urllib, re, pwd, grp, os, sys
  File "/usr/lib/python2.5/urllib.py", line 26, in 
    import socket
  File "/home/juan/Escritorio/Python/TP3/ejercicio1/socket.py", line 15, in 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AttributeError: 'module' object has no attribute 'AF_INET'

Original exception was:
Traceback (most recent call last):
  File "socket.py", line 7, in 
    import socket
  File "/home/juan/Escritorio/Python/TP3/ejercicio1/socket.py", line 15, in 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AttributeError: 'module' object has no attribute 'AF_INET'

El tema es que busqué y busqué y no había forma de darme cuenta cual era el error, hasta q se me ocurrio cambiarle el nombre a socket.py por client_echo.py y... Bingo!
No soy muy apto tecnicamente para hablar de Python pero parece que el import socket importaba el script server pegado mas arriba y no el módulo socket original que tiene todas las definiciones de clase y funciones.
En fín, era para comentarles una de esas cosas que nos pueden tener renegando un buen rato con el objetivo de que ustedes se ahorren su rato haciendo uso del mio. :)

Hasta la próxima!

1 comentario:

  1. Demonios era tan lógico, gracias master por la respuesta, ahora recordare no llamar a mis archivos como funciones ya existentes, en cierta forma me recuerda a Java

    ¡¡Saludos!!

    ResponderEliminar