TypeError: el objeto 'módulo' no es invocable

544
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?

usuario551717
fuente
8
Una vez recibí este error porque tenía una variable (global) y una función con el mismo nombre.
remustata

Respuestas:

563

socketes un módulo, que contiene la clase socket.

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

>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>

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?"
  • "El código está intentando llamar socket. ¡Eso debería ser invocable! ¿La variable socketes lo que creo que es?"
  • Debería imprimir qué es el socket y verificar print socket
Katriel
fuente
Actualmente estoy importando socket como este: desde socket import *
user551717
También lo cambié a socket de socket de importación y sigo recibiendo el mismo error.
user551717
@usuario: si lo haces print socket, verás que el nombre socketes 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á uno import socketo algunos de estos elementos donde no lo espera.
Katriel
2
Ohh lo entiendo El socket.socketfue un poco confuso. Simplemente lo hice import write_to_filey luego, dado que el método que estaba usando dentro write_to_file.pyse llama writeToTextFilesimplemente randwrite_to_file.writeToTextFile
maudulus
99
Vale la pena señalar que esto no era obvio para al menos 133 personas que se tomaron el tiempo para votar (incluido yo mismo) que no entendieron esto. Ahora, es obvio, y la próxima vez que llegue a mi caja de herramientas, encontraré esta herramienta cuando un módulo sea reportado como "no invocable". Comenzar con un nuevo idioma es la parte más difícil.
jmort253
168

Suponga que el contenido de YourClass.py es:

class YourClass:
    # ......

Si utiliza:

from YourClassParentDir import YourClass  # means YourClass.py

De esta manera, obtuve TypeError: el objeto 'módulo' no es invocable si luego intentaste usarlo YourClass().

Pero, si usas:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

o uso YourClass.YourClass(), me funciona.

Puntilla
fuente
2
class = YourClass.YourClass ()
KunMing Xie
2
Resolví este problema usando from yourClass import *
Keith
104

Agregue al principal __init__.pyen 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
Jose Alban
fuente
55
¿No debería estar from .YourClass import YourClass en el __init__.pyarchivo?
Nicolas Seiller
28

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:

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

cuando mi zag necesitaba hacer lo siguiente:

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

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:

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

Si esto no cumple con el estándar, avíseme.

zerocog
fuente
22

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

O tienes un import socketdespué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 "<input>", line 1, in <module>
TypeError: 'module' object is not callable
moinudin
fuente
He importado socket como: from socket import * Puedo cambiarlo, pero tomará un tiempo, así que soy reacio a hacerlo.
usuario551717
@user Probablemente más tarde en algún lugar obtuviste un import socket, que importará el módulo que socketanula la clase socket. Ver fragmento de código en editar.
moinudin
3
@usuario: deberías cambiarlo. La razón por la que las 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 usted import *, llena ese espacio de nombres con todo tipo de cosas que otros módulos definen. En este caso, no está claro de dónde socketproviene el nombre : ¿es el módulo o algo definido en ese módulo? Si siempre usa import socketo from socket import socket, nunca tendrá este problema, ya que puede ver exactamente qué nombres están en uso.
Katriel
bueno. Gracias por el consejo. Acabo de adquirir el hábito de muchos tutoriales.
user551717
7

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 nombrado socket.pyen este directorio. Una vez que lo encuentre, cámbiele el nombre o muévalo. Cuando importa socket, socket.pyse usa desde el directorio actual en lugar del socket.pydesde 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).

viento negro
fuente
1
Esto definitivamente vale la pena señalar. Solo estaba intentando una comprobación rápida con sockets, así que simplemente nombré el archivo 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/…
Czechnology
0

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.

Traceback (most recent call last):
   File "/Users/ubuntu/.virtualenvs/virtualenv/bin/mycli", line 11, in <module>
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]
    },
# ...
)

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.

Luke Exton
fuente
0

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.

umairhhhs
fuente
0

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.

Ayesha Siddiqa
fuente
-1

Una forma sencilla de resolver este problema es exportar el PYTHONPATHentorno variable. 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 socket.pyarchivo.

Oscar Ardila
fuente