web-dev-qa-db-fra.com

TypeError: l'objet 'module' n'est pas appelable

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

Pourquoi est-ce que je reçois cette erreur? Je suis confus.

Que devez-vous savoir pour répondre à ma question?

410
user551717

socket est un module contenant la classe socket.

Vous devez faire socket.socket(...) ou 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'>

Notez que l'erreur ici est assez facile à comprendre: si module object is not callable, vous appelez probablement un objet module! Qu'est-ce qu'un objet module? C'est le type de chose que vous obtenez lorsque vous importez un module.

Mais même si vous ne comprenez pas cela (ce qui est bien, il est souvent déroutant que les classes, modules, fonctions, etc. ne soient que des objets comme tout le reste), il existe un moyen assez simple de démarrer le débogage:

  • "Hmm, module object is not callable. On dirait que j'essaie d'appeler quelque chose que tu ne peux pas appeler. Je me demande comment j'essaie d'appeler?"
  • "Oh, j'appelle socket. Cela devrait être appelable! Je me demande si la variable socket est ce que je pense qu'elle est?`
  • print socket
437
Katriel

Supposons que le contenu de YourClass.py est:

class YourClass:
    # ......

Si tu utilises:

from YourClassParentDir import YourClass  # means YourClass.py

De cette façon, j'ai TypeError: l'objet 'module' n'est pas appelable si vous avez ensuite essayé d'utiliser YourClass().

Mais si vous utilisez:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

ou utilisez YourClass.YourClass(), cela fonctionne pour moi.

96
Bowen Xu

Ajoutez au __init__.py principal dans YourClassParentDir, par exemple:

from .YourClass import YourClass

Ensuite, vous aurez une instance de votre classe prête lorsque vous l'importerez dans un autre script:

from YourClassParentDir import YourClass
84
Jose Alban

Voici un autre casse-tête, qui m'a pris un certain temps à voir, même après avoir lu ces messages. Je mettais en place un script pour appeler mes scripts Python bin. Je devenais le module non appelable aussi.

Mon zig était que je faisais ce qui suit:

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

quand mon zag devait faire ce qui suit:

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

En résumé, vérifiez votre imbrication de paquet et de module. 

Ce que j'essaie de faire est d'avoir un répertoire de scripts qui ne porte pas l'extension * .py, et que les modules 'bin' soient toujours dans mypackage/bin et ceux-ci ont mon extension * .py. Je suis novice dans l'emballage et j'essaie de respecter les normes telles que je les interprète. Donc, j'ai à la racine de l'installation: 

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

Si cela n'est pas conforme à la norme, veuillez me le faire savoir.

25
zerocog

Il semble que vous ayez importé le module socket sous le nom import socket. Donc socket est le module. Vous devez modifier cette ligne en self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), ainsi que toute autre utilisation du module socket, ou modifier l'instruction d'importation en from socket import socket.

Ou vous avez un import socket après votre 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
20
marcog

Je sais que ce fil a un an, mais le vrai problème réside dans votre répertoire de travail.

Je crois que le répertoire de travail est C:\Users\Administrator\Documents\Mibot\oops\. Veuillez vérifier le fichier nommé socket.py dans ce répertoire. Une fois que vous l'avez trouvé, renommez-le ou déplacez-le. Lorsque vous importez socket, socket.py du répertoire en cours est utilisé à la place du socket.py du répertoire de Python. J'espère que cela a aidé. :)

Remarque: N'utilisez jamais les noms de fichiers du répertoire Python pour enregistrer le nom de fichier de votre programme. cela entrera en conflit avec votre (vos) programme (s).

7
blackwind

Lors de la configuration d'un point d'entrée console_scripts dans setup.py, j'ai constaté que ce problème existait lorsque le noeud final était un module ou un package plutôt qu'une fonction du module.

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

Par exemple

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

Aurait du être

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

Pour qu'il fasse référence à une fonction appelable plutôt qu'au module lui-même. Cela semble ne faire aucune différence si le module a un bloc if __== '__main__':. Cela ne rendra pas le module appelable. 

0
Luke Exton

Je suppose que vous avez remplacé la fonction/variable intégrée ou un autre "module" en définissant la variable globale "module". il suffit d’imprimer le module et de voir ce qu’il contient.

0
umairhhhs

Un moyen simple de résoudre ce problème est d’exporter l’environnement de variable PYTHONPATH. Par exemple, pour Python 2.6 dans Debian/GNU Linux: 

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

Dans d'autres systèmes d'exploitation, vous devez d'abord trouver l'emplacement de ce module ou du fichier socket.py.

0
Oscar Ardila