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é necesitas saber para responder mi pregunta?
Respuestas:
socket
es un módulo, que contiene la clasesocket
.Necesitas hacer
socket.socket(...)
ofrom socket import socket
:Esto es lo que significa el mensaje de error:
dice
module object is not callable
, porque su código está llamando a un objeto de módulo . Un objeto de módulo es el tipo de cosa que obtienes cuando importas un módulo. Lo que intentaba hacer es llamar a un objeto de clase dentro del objeto de módulo que tiene el mismo nombre que el módulo que lo contiene.Aquí hay una manera de desglosar lógicamente este tipo de error:
module object is not callable
. Python me dice que mi código está tratando de llamar a algo que no se puede llamar. ¿Cuál es el código que intenta llamar?"socket
. ¡Eso debería ser invocable! ¿La variablesocket
es lo que creo que es?"print socket
fuente
print socket
, verás que el nombresocket
es un módulo. Tiene que haber sido vinculado a ese módulo en alguna parte ! Lea detenidamente su código y estoy seguro de que verá unoimport socket
o algunos de estos elementos donde no lo espera.socket.socket
fue un poco confuso. Simplemente lo hiceimport write_to_file
y luego, dado que el método que estaba usando dentrowrite_to_file.py
se llamawriteToTextFile
simplemente randwrite_to_file.writeToTextFile
Suponga que el contenido de YourClass.py es:
Si utiliza:
De esta manera, obtuve TypeError: el objeto 'módulo' no es invocable si luego intentaste usarlo
YourClass()
.Pero, si usas:
o uso
YourClass.YourClass()
, me funciona.fuente
Agregue al principal
__init__.py
en YourClassParentDir, por ejemplo:Luego, tendrá una instancia de su clase lista cuando la importe a otro script:
fuente
from .YourClass import YourClass
en el__init__.py
archivo?Aquí hay otro problema, que me llevó un tiempo ver incluso después de leer estas publicaciones. Estaba configurando un script para llamar a mis scripts de python bin. Estaba obteniendo el módulo no invocable también.
Mi zig era que estaba haciendo lo siguiente:
cuando mi zag necesitaba hacer lo siguiente:
En resumen, verifique su paquete y la anidación de módulos.
Lo que estoy tratando de hacer es tener un directorio de scripts que no tenga la extensión * .py, y todavía tenga los módulos 'bin' para estar en mypackage / bin y estos tengan mi extensión * .py. Soy nuevo en el empaque e intento seguir los estándares mientras los interpreto. Entonces, tengo en la raíz de configuración:
Si esto no cumple con el estándar, avíseme.
fuente
Parece que lo que has hecho es importado el
socket
módulo comoimport socket
. Por esosocket
es el módulo. Debe cambiar esa línea aself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, así como cualquier otro uso delsocket
módulo, o cambiar la declaración de importación afrom socket import socket
.O tienes un
import socket
después de tufrom socket import *
:fuente
import socket
, que importará el módulo quesocket
anula la clasesocket
. Ver fragmento de código en editar.from <...> import *
importaciones son malas, malas, malas es más o menos esto: normalmente sabes exactamente qué hay en el espacio de nombres global, porque es exactamente lo que has puesto allí. Pero cuando ustedimport *
, llena ese espacio de nombres con todo tipo de cosas que otros módulos definen. En este caso, no está claro de dóndesocket
proviene el nombre : ¿es el módulo o algo definido en ese módulo? Si siempre usaimport socket
ofrom socket import socket
, nunca tendrá este problema, ya que puede ver exactamente qué nombres están en uso.Sé que este hilo tiene un año, pero el verdadero problema está en su directorio de trabajo.
Creo que el directorio de trabajo es
C:\Users\Administrator\Documents\Mibot\oops\
. Verifique el archivo nombradosocket.py
en este directorio. Una vez que lo encuentre, cámbiele el nombre o muévalo. Cuando importa socket,socket.py
se usa desde el directorio actual en lugar delsocket.py
desde el 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 programa; entrará en conflicto con su (s) programa (s).
fuente
socket.py
. Bueno, eso estaba causando exactamente el mismo mensaje de error. Esta página me puso en el camino correcto: python-notes.curiousefficiency.org/en/latest/python_concepts/…Al configurar un punto de entrada console_scripts en setup.py, descubrí 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.
Por ejemplo
Debería haber sido
Para que se refiera a una función invocable en lugar del módulo en sí. Parece que no hay diferencia si el módulo tiene un
if __name__ == '__main__':
bloque. Esto no hará que el módulo sea invocable.fuente
Supongo que ha anulado la función / variable incorporada o algo más "módulo" al establecer la variable global "módulo". solo imprima el módulo, vea lo que contiene.
fuente
verifique las declaraciones de importación ya que un módulo no es invocable. En Python, todo (incluidas funciones, métodos, módulos, clases, etc.) es un objeto.
fuente
Una forma sencilla de resolver este problema es exportar el
PYTHONPATH
entorno variable. Por ejemplo, para Python 2.6 en Debian / GNU Linux:En otros sistemas operativos, primero encontrará la ubicación de este módulo o el
socket.py
archivo.fuente