TypeError: el objeto ‘módulo’ no se puede llamar

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é estoy recibiendo este error? Estoy confundido.

¿Qué necesitas saber para responder 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 el module object is not callable se puede llamar, probablemente esté llamando a un objeto de módulo. ¿Qué es un objeto de módulo? Es el tipo de cosa que obtienes cuando importas un módulo.

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

  • “Hmm, el module object is not callable se puede llamar. Eso suena como que estoy tratando de llamar a algo que no puedes llamar. Me pregunto a qué estoy tratando de llamar.”
  • “Oh, estoy llamando a socket . ¡Eso debería ser invocable! Me pregunto si la variable socket es lo que creo que es?`
  • print socket

Supongamos que el contenido de YourClass.py es:

 class YourClass: # ...... 

Si utiliza:

 from YourClassParentDir import YourClass # means YourClass.py 

De esta manera, obtuve el objeto TypeError: ‘módulo’ que no se puede llamar si intentas usar YourClass() .

Pero, si usas:

 from YourClassParentDir.YourClass import YourClass # means Class YourClass 

o use YourClass.YourClass() , funciona para mí.

Agregue al __init__.py principal en YourClassParentDir, por ejemplo:

 from .YourClass import YourClass 

Luego, tendrá una instancia de su clase lista cuando la importe a otro script:

 from YourClassParentDir import YourClass 

Aquí hay otro gotcha, que me tomó un tiempo ver incluso después de leer estas publicaciones. Estaba configurando un script para llamar a mis scripts de python bin. Estaba consiguiendo que el módulo no se pudiera llamar también.

Mi zig era que estaba haciendo lo siguiente:

 from mypackage.bin import myscript ... myscript(...) 

cuando mi zag necesitaba hacer lo siguiente:

 from mypackage.bin.myscript import myscript ... myscript(...) 

En resumen, revise nuevamente su paquete y módulo de anidamiento.

Lo que estoy tratando de hacer es tener un directorio de secuencias de comandos que no tenga la extensión * .py, y aún tenga los módulos ‘bin’ en mypackage / bin y estos tienen mi extensión * .py. Soy nuevo en el empaque y trato de seguir los estándares mientras los interpreto. Por lo tanto, tengo en la raíz de configuración:

 setup.py scripts/ script1 mypackage/ bin/ script1.py subpackage1/ subpackage_etc/ 

Si esto no cumple con el estándar, hágamelo saber.

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

O tienes un import socket después de tu 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 "", line 1, in  TypeError: 'module' object is not callable 

Sé que este hilo tiene un año de antigüedad, pero el problema real está en su directorio de trabajo.

Creo que el directorio de trabajo es C:\Users\Administrator\Documents\Mibot\oops\ . Por favor verifique el archivo llamado socket.py en este directorio. Una vez que lo encuentre, renómbrelo o muévalo. Cuando importa socket, socket.py del directorio actual se usa en lugar del socket.py del directorio de Python. Espero que esto haya ayudado. 🙂

Nota: Nunca use los nombres de archivo del directorio de Python para guardar el nombre de archivo de su progtwig; entrará en conflicto con su progtwig (s).

Una forma sencilla de resolver este problema es exportar el entorno de la variable PYTHONPATH . Por ejemplo, para Python 2.6 en Debian / GNU Linux:

 export PYTHONPATH=/usr/lib/python2.6` 

En otros sistemas operativos, primero encontrará la ubicación de este módulo o el archivo socket.py .

Al configurar un entrypoint de console_scripts en setup.py, encontré que este problema existía cuando el punto final era un módulo o paquete en lugar de una función dentro del módulo.

 Traceback (most recent call last): File "/Users/ubuntu/.virtualenvs/virtualenv/bin/mycli", line 11, in  load_entry_point('my-package', 'console_scripts', 'mycli')() TypeError: 'module' object is not callable 

Por ejemplo

 from setuptools import setup setup ( # ... entry_points = { 'console_scripts': [mycli=package.module.submodule] }, # ... ) 

Debería haber sido

 from setuptools import setup setup ( # ... entry_points = { 'console_scripts': [mycli=package.module.submodule:main] }, # ... ) 

De modo que se refiera a una función que se puede llamar en lugar del módulo en sí. Parece que no hay ninguna diferencia si el módulo tiene un bloque if __name__ == '__main__': . Esto no hará que el módulo sea llamable.

Supongo que ha anulado la función / variable incorporada u otra “módulo” configurando la variable global “módulo”. simplemente imprima el módulo y vea qué hay en él.