TypeError: 'module' object is not callable

File "C:\Users\Administrator\Documents\Mibot\oops\blinkserv.py", line 82, in __init__
    self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable

¿Por qué recibo este error? Estoy confundido.

¿Qué necesita saber para responder a mi pregunta?

socket es un módulo que contiene la clase socket.

Necesitas hacer socket.socket(...) o from socket import socket:

>>> import socket
>>> socket

>>> socket.socket

>>>
>>> from socket import socket
>>> socket

Observe que el error aquí es bastante fácil de entender: si module object is not callable, ¡probablemente está llamando a un objeto módulo! ¿Qué es un objeto módulo? Es el tipo de cosa que obtienes cuando importas un módulo.

Pero incluso si no lo entiendes (lo cual está bien, a menudo es confuso que las clases, los módulos, las funciones, etc., sean sólo objetos como todo lo demás), hay una forma bastante fácil de empezar a depurar:

  • "Hmm, el objeto módulo no es llamable. Eso suena como si estuviera intentando llamar a algo que no se puede llamar. Me pregunto a qué estoy tratando de llamar'"
  • "Oh, yo'estoy llamando a socket. ¡Eso debería ser invocable! Me pregunto si la variable "socket" es lo que creo que es.
  • print socket
Comentarios (8)

Parece que lo que has hecho es importar el módulo socket como import socket. Por lo tanto socket es el módulo. Tienes que cambiar esa línea por self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), así como cualquier otro uso del módulo socket, o cambiar la sentencia import por from socket import socket.

O tiene un import socket después de su from socket import *:

>>> from socket import *
>>> serv = socket(AF_INET,SOCK_STREAM)
>>> import socket
>>> serv = socket(AF_INET,SOCK_STREAM)
Traceback (most recent call last):
  File "<input>", line 1, in 
TypeError: 'module' object is not callable
Comentarios (4)

Sé que este hilo es de hace un año, pero el verdadero problema está en tu directorio de trabajo.

Creo que el directorio de trabajo es C:\NAdministrador\NDocumentos\NMibot\oops\. Por favor, busque el archivo llamado socket.py en este directorio. Una vez que lo encuentres, renómbralo o muévelo. Cuando importas socket, se utiliza socket.py del directorio actual en lugar de socket.py del directorio de Python's. Espero que esto te haya ayudado :)

Nota: Nunca uses los nombres de archivo del directorio de Python's para guardar el nombre de tu programa's; entrará en conflicto con tu(s) programa(s).

Comentarios (1)