TypeError: ‘module’-object kan niet worden aangeroepen

Waarom krijg ik deze foutmelding?
Ik ben in de war.

Wat moet je weten om mijn vraag te beantwoorden?


Antwoord 1, autoriteit 100%

socket is een module, die de klasse socket bevat.

Je moet socket.socket(...) of from socket import socket doen:

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

Dit is wat de foutmelding betekent:
Er staat dat module object is not callable, omdat uw code een module-object aanroept. Een module-object is het soort ding dat u krijgt wanneer u een module importeert. Wat u probeerde te doen, is een klasse-object binnen het module-object aanroepen dat toevallig dezelfde naam heeft als de module die het bevat.

Hier is een manier om dit soort fouten logisch op te splitsen:

  • module object is not callable. Python vertelt me ​​dat mijn code iets probeert aan te roepen dat niet kan worden aangeroepen. Wat probeert mijn code aan te roepen?”
  • “De code probeert socket aan te roepen. Dat zou oproepbaar moeten zijn! Is de variabele socket wat ik denk dat het is?`
  • Ik moet uitprinten wat socket is en print socket
  • aanvinken


Antwoord 2, autoriteit 34%

Stel dat de inhoud van YourClass.py is:

class YourClass:
    # ......

Als je het volgende gebruikt:

from YourClassParentDir import YourClass  # means YourClass.py

Op deze manier krijgt u TypeError: ‘module’ object is not callable als u vervolgens YourClass() probeert aan te roepen.

Maar als u het volgende gebruikt:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

of gebruik YourClass.YourClass(), het werkt.


Antwoord 3, autoriteit 18%

Toevoegen aan de hoofdmap __init__.py in YourClassParentDir, bijvoorbeeld:

from .YourClass import YourClass

Vervolgens heb je een exemplaar van je klasse klaar wanneer je het in een ander script importeert:

from YourClassParentDir import YourClass

Antwoord 4, autoriteit 5%

Hier is nog een probleem, het duurde even voordat ik het zag, zelfs na het lezen van deze berichten. Ik was een script aan het opzetten om mijn python bin-scripts aan te roepen. Ik kreeg de module ook niet oproepbaar.

Mijn zig was dat ik het volgende deed:

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

wanneer mijn zag het volgende moest doen:

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

Kortom, controleer nogmaals de nesting van uw pakket en module.

Wat ik probeer te doen is om een ​​scriptmap te hebben die niet de *.py extensie heeft, en toch de ‘bin’ modules in mypackage/bin te hebben en deze hebben mijn *.py extensie. Ik ben nieuw in het verpakken en probeer de normen te volgen terwijl ik ze interpreteer. Dus ik heb in de setup root:

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

Als dit niet in overeenstemming is met de norm, laat het me dan weten.


Antwoord 5, autoriteit 4%

Kort antwoord: U roept een bestand/map aan als een functie in plaats van een echte functie

Lees verder:

Dit soort fouten treedt op wanneer u een module importeert die het als een functie denkt en deze aanroept.
Dus in de python-module is een .py-bestand. Pakketten (directories) kunnen ook als modules worden beschouwd.
Laten we zeggen dat ik een create.py-bestand heb. In dat bestand heb ik een functie als deze:

#inside create.py
def create():
  pass

Nu, in een ander codebestand als ik het zo doe:

#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here

Het geeft deze fout omdat ik het bestand create.py als een functie aanroep.
dus ik moet dit doen:

from create import create
create() #now it works.

Hopelijk helpt dat! Veel plezier met coderen!


Antwoord 6, autoriteit 4%

Het lijkt erop dat je de module socket hebt geïmporteerd als import socket. Daarom is socket de module. U moet ofwel die regel wijzigen in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), evenals elk ander gebruik van de socket-module, of verander het importstatement in from socket import socket.

Of je hebt een import socket na je 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

Antwoord 7

Ik weet dat deze thread een jaar oud is, maar het echte probleem zit in je werkmap.

Ik geloof dat de werkmap C:\Users\Administrator\Documents\Mibot\oops\ is. Controleer het bestand met de naam socket.py in deze map. Zodra je het hebt gevonden, hernoem je het of verplaats je het. Wanneer je socket importeert, wordt socket.py uit de huidige map gebruikt in plaats van de socket.py uit de map van Python. Hoop dat dit heeft geholpen. 🙂

Opmerking: Gebruik nooit de bestandsnamen uit de Python-directory om de bestandsnaam van uw programma op te slaan; het zal conflicteren met je programma(‘s).


Antwoord 8

Ik had hetzelfde probleem. toen probeerde ik niet te gebruiken
from YourClass import YourClass

Ik heb zojuist de hele code van YourClass.py gekopieerd en uitgevoerd in de hoofdcode (of huidige code). De fout is opgelost


Antwoord 9

Bij het configureren van een console_scripts-ingangspunt in setup.py ontdekte ik dat dit probleem bestond wanneer het eindpunt een module of pakket was in plaats van een functie binnen de 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

Bijvoorbeeld

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

Had moeten zijn

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

Zodat het zou verwijzen naar een aanroepbare functie in plaats van naar de module zelf. Het lijkt geen verschil te maken of de module een if __name__ == '__main__': blok heeft. Hierdoor wordt de module niet oproepbaar.


Antwoord 10

Ik vermoed dat je de ingebouwde functie/variabele of iets anders “module” hebt overschreven door de globale variabele “module” in te stellen. print gewoon de module en kijk wat erin zit.


Antwoord 11

Een eenvoudige manier om dit probleem op te lossen is door de PYTHONPATH variabele omgeving te exporteren. Bijvoorbeeld voor Python 2.6 in Debian/GNU Linux:

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

In andere besturingssystemen zou u eerst de locatie van deze module of het bestand socket.py vinden.


Antwoord 12

controleer de import-statements aangezien een module niet kan worden aangeroepen.
In Python is alles (inclusief functies, methoden, modules, klassen enz.) een object.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

13 + thirteen =

Other episodes