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


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

Pourquoi ai-je cette erreur? Je suis confus.

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


8
Une fois, j'ai eu cette erreur car j'avais à la fois une variable (globale) et une fonction du même nom.
remustata

Réponses:


563

socketest 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'>

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?"
  • "Le code essaie d'appeler socket. Cela devrait être appelable! La variable socketest-elle ce que je pense?"
  • Je devrais imprimer ce qu'est la prise et vérifier print socket

Je suis actuellement en train d'importer un socket comme ceci: depuis l'importation de socket *
user551717

Je l'ai également changé en socket import socket et j'obtiens toujours la même erreur.
user551717

@user: si vous le faites, print socketvous verrez que le nom socketest un module. Il doit avoir été lié à ce module quelque part ! Lisez attentivement votre code et je suis sûr que vous verrez un import socketou certains tels où vous ne vous y attendez pas.
Katriel

2
Ohh je comprends. Le socket.socketétait un peu déroutant. J'ai simplement fait import write_to_fileet puis, puisque la méthode que j'utilisais à l'intérieur write_to_file.pys'appelle writeToTextFileI simplement randwrite_to_file.writeToTextFile
maudulus

9
Il convient de noter que ce n'était pas évident pour au moins 133 personnes qui ont pris le temps de voter (moi y compris) qui ne comprenaient pas cela. Maintenant, c'est évident, et la prochaine fois que j'atteindrai dans ma boîte à outils, je trouverai cet outil lorsqu'un module est signalé comme "non appelable". Commencer avec une nouvelle langue est la partie la plus difficile.
jmort253

168

Supposons que le contenu de YourClass.py soit:

class YourClass:
    # ......

Si tu utilises:

from YourClassParentDir import YourClass  # means YourClass.py

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:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

ou utiliser YourClass.YourClass(), ça marche pour moi.


2
class = YourClass.YourClass ()
KunMing Xie

2
J'ai résolu ce problème en utilisant votre importation de yourClass *
Keith

104

Ajoutez au principal __init__.pydans 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

5
Ça ne devrait pas être from .YourClass import YourClass dans le __init__.pydossier?
Nicolas Seiller

28

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:

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

quand mon zag devait faire ce qui suit:

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

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:

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

Si ce n'est pas conforme à la norme, faites-le moi savoir.


22

Il semble que ce que vous avez fait soit importé socketsous forme de module import socket. C'est donc socketle module. Vous devez soit changer cette ligne en self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), ainsi que toutes les autres utilisations du socketmodule, ou changer l'instruction d'importation en from socket import socket.

Ou vous avez un import socketaprè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

J'ai importé socket en tant que: from socket import * Je peux le changer, mais cela prendra un certain temps, donc je suis réticent à le faire.
user551717

@user Vous avez probablement quelque part un an plus tard import socket, qui importera le module en socketremplaçant la classe socket. Voir l'extrait de code en cours de modification.
moinudin

3
@user: vous devez le changer. La raison pour laquelle les 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 vous import *, 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 nom socket- est-ce le module ou quelque chose défini dans ce module? Si vous utilisez toujoursimport socket ou from socket import socket, vous n'aurez jamais ce problème, car vous pouvez voir exactement quels noms sont utilisés.
Katriel

d'accord. Merci pour le conseil. Je viens de prendre l'habitude de nombreux tutoriels.
user551717

7

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.pydans ce répertoire. Une fois que vous l'avez trouvé, renommez-le ou déplacez-le. Lorsque vous importez un socket, socket.pyle répertoire courant est utilisé à la place du socket.pyré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.


1
Cela vaut vraiment la peine d'être noté. J'essayais juste une vérification rapide avec les sockets alors j'ai simplement nommé le fichier 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/…
Czechnology

0

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.

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 ne fait aucune différence si le module a un if __name__ == '__main__':bloc. Cela ne rendra pas le module appelable.


0

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.


0

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.


-1

Un moyen simple de résoudre ce problème consiste à exporter l' PYTHONPATHenvironnement variable. 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 socket.pyfichier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.