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.
Que devez-vous savoir pour répondre à ma question?
Réponses:
socket
est un module contenant la classesocket
.Vous devez faire
socket.socket(...)
oufrom socket import socket
:Voici ce que signifie le message d'erreur:
Il dit
module object is not callable
, car votre code appelle un objet module . Un objet module est le type de chose que vous obtenez lorsque vous importez un module. Ce que vous essayez de faire, c'est d'appeler un objet de classe dans l'objet module qui se trouve avoir le même nom que le module qui le contient.Voici un moyen de décomposer logiquement ce type d'erreur:
module object is not callable
. Python me dit mon code essayant d'appeler quelque chose qui ne peut pas être appelé. Quel est mon code essayant d'appeler?"socket
. Cela devrait être appelable! La variablesocket
est-elle ce que je pense?"print socket
la source
print socket
vous verrez que le nomsocket
est un module. Il doit avoir été lié à ce module quelque part ! Lisez attentivement votre code et je suis sûr que vous verrez unimport socket
ou certains tels où vous ne vous y attendez pas.socket.socket
était un peu déroutant. J'ai simplement faitimport write_to_file
et puis, puisque la méthode que j'utilisais à l'intérieurwrite_to_file.py
s'appellewriteToTextFile
I simplement randwrite_to_file.writeToTextFile
Supposons que le contenu de YourClass.py soit:
Si tu utilises:
De cette façon, j'ai obtenu TypeError: l'objet 'module' n'est pas appelable si vous essayez ensuite de l'utiliser
YourClass()
.Mais si vous utilisez:
ou utiliser
YourClass.YourClass()
, ça marche pour moi.la source
Ajoutez au principal
__init__.py
dans YourClassParentDir, par exemple:Ensuite, vous aurez une instance de votre classe prête lorsque vous l'importerez dans un autre script:
la source
from .YourClass import YourClass
dans le__init__.py
dossier?Voici un autre problème, qui m'a pris un certain temps à voir même après avoir lu ces messages. J'étais en train de configurer un script pour appeler mes scripts bin python. J'obtenais le module non appelable aussi.
Mon zig était que je faisais ce qui suit:
quand mon zag devait faire ce qui suit:
En résumé, revérifiez l'imbrication de vos packages et modules.
Ce que j'essaie de faire, c'est d'avoir un répertoire de scripts qui n'a pas l'extension * .py, et qui a toujours les modules «bin» pour être dans mypackage / bin et ceux-ci ont mon extension * .py. Je suis nouveau dans l'emballage et j'essaie de suivre les normes telles que je les interprète. Donc, j'ai à la racine de l'installation:
Si ce n'est pas conforme à la norme, faites-le moi savoir.
la source
Il semble que ce que vous avez fait soit importé
socket
sous forme de moduleimport socket
. C'est doncsocket
le module. Vous devez soit changer cette ligne enself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, ainsi que toutes les autres utilisations dusocket
module, ou changer l'instruction d'importation enfrom socket import socket
.Ou vous avez un
import socket
après votrefrom socket import *
:la source
import socket
, qui importera le module ensocket
remplaçant la classesocket
. Voir l'extrait de code en cours de modification.from <...> import *
importations sont mauvaises, mauvaises, mauvaises est plus ou moins la suivante: normalement, vous savez exactement ce qui se trouve dans l'espace de noms global, car c'est exactement ce que vous y avez mis. Mais quand vousimport *
, vous remplissez cet espace de noms avec toutes sortes de choses que d'autres modules définissent. Dans ce cas, on ne sait pas d'où vient le nomsocket
- est-ce le module ou quelque chose défini dans ce module? Si vous utilisez toujoursimport socket
oufrom socket import socket
, vous n'aurez jamais ce problème, car vous pouvez voir exactement quels noms sont utilisés.Je sais que ce fil a un an, mais le vrai problème est 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 un socket,socket.py
le répertoire courant est utilisé à la place dusocket.py
répertoire Python. J'espère que cela vous 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 vos programmes.
la source
socket.py
. Eh bien, cela provoquait exactement le même message d'erreur. Cette page m'a mis sur la bonne voie: python-notes.curiousefficiency.org/en/latest/python_concepts/…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 point de terminaison était un module ou un package plutôt qu'une fonction dans le module.
Par exemple
Aurait du être
Pour qu'il fasse référence à une fonction appelable plutôt qu'au module lui-même. Cela ne fait aucune différence si le module a un
if __name__ == '__main__':
bloc. Cela ne rendra pas le module appelable.la source
Je suppose que vous avez outrepassé la fonction / variable intégrée ou quelque chose d'autre "module" en définissant la variable globale "module". il suffit d'imprimer le module pour voir ce qu'il contient.
la source
vérifiez les instructions d'importation car un module n'est pas appelable. En Python, tout (y compris les fonctions, les méthodes, les modules, les classes, etc.) est un objet.
la source
Un moyen simple de résoudre ce problème consiste à exporter l'
PYTHONPATH
environnement variable. Par exemple, pour Python 2.6 dans Debian / GNU Linux:Dans d'autres systèmes d'exploitation, vous devez d'abord trouver l'emplacement de ce module ou du
socket.py
fichier.la source