826 votes

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 ai-je cette erreur? Je suis confus.

Qu'est-ce que vous devez savoir pour répondre à ma question?

827voto

katrielalex Points 40655

socket est un module qui contient la classe socket.

Ce que 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 êtes probablement appeler un module objet! Qu'est ce qu'un module objet? C'est le type de chose que vous obtenez lorsque vous importez un module.

Mais même si vous ne comprenez pas que (ce qui est bien, c'est souvent source de confusion que de classes, modules, fonctions, etc sont tous simplement des objets, comme tout le reste), il y a une manière assez facile de démarrer le débogage:

  • "Hmm, module object is not callable. Qui dirait que je suis en train d'appeler quelque chose que vous ne pouvez pas appeler. Je me demande ce que je suis en train de l'appeler?"
  • "Oh, je suis appelant socket. Qui devrait être appelable! Je me demande si la variable socket est ce que je pense c'est"?
  • print socket

38voto

zerocog Points 135

Voici un autre chat, qui m'a pris un certain temps pour voir, même après la lecture de ces posts. J'ai été la mise en place d'un script à appeler mon python bin scripts. J'ai fait le module non remboursables.

Mon zig que je faisais le suivant:

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

quand mon zag nécessaires pour effectuer les opérations suivantes:

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

En résumé, la double vérification de votre colis et le module de nidification.

Ce que j'essaie de faire est d'avoir un répertoire de scripts qui n'a pas de *.py extension, et j'ai toujours le " bin " modules dans mypackage/bin, et ils ont mon *.py extension. Je suis nouveau à l'emballage, et en essayant de respecter les normes comme je suis interprète. Donc, j'ai lors de l'installation de la racine:

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

Si cela n'est pas conforme à la norme, s'il vous plaît laissez-moi savoir.

24voto

marcog Points 39356

Il semble que ce que vous avez fait est importé le socket Module import socket . Par conséquent socket est le module. Vous devez soit changer cette ligne en self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) , ainsi que toute autre utilisation du module socket , ou changer l'instruction import 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
 

8voto

blackwind Points 73

je sais que ce fil est d'un an. mais le vrai problème est dans le répertoire de travail de la vôtre. je crois que le répertoire de travail est "C:\Users\Administrator\Documents\Mibot\oops\" veuillez vérifier votre fichier nommé socket.py dans ce répertoire. si vous trouvez que renommer ou déplacer. lorsque vous importez de la socket, socket.py à partir du répertoire courant est utilisé à la place de la socket.py de pythons répertoire.

espérons que cela a aidé. :)

Remarque.Ne jamais utiliser les noms de fichier de pythons répertoire pour enregistrer vos programmes de nom de fichier. il entrera en conflit avec vos programmes

-1voto

Oscar Ardila Points 61

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 un autre système opérationnel, vous pouvez trouver d'abord où est ce module ou où est le fichier socket.py.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X