810 Stimmen

TypeError: Das Objekt 'module' ist nicht aufrufbar

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

Warum erhalte ich diese Fehlermeldung? Ich bin verwirrt.

Was müssen Sie wissen, um meine Frage zu beantworten?

25 Stimmen

Ich habe diesen Fehler einmal bekommen, weil ich sowohl eine (globale) Variable als auch eine Funktion mit demselben Namen hatte.

2 Stimmen

Ich erhielt diese Fehlermeldung mit dem Dateinamen random.py im gleichen Ordner, in dem ich eine zuvor funktionierende ipynb-Datei hatte. Ich änderte den Namen der Datei in random_function.py und startete das Jupyter-Notebook neu. Der Fehler verschwand. Um zu testen, ob der Name random.py das Problem war, änderte ich die Datei random_function.py wieder in random.py. Das Problem trat wieder auf. Benennen Sie Ihre Datei nicht nach dem Namen einer Python-Bibliothek.

24voto

moinudin Punkte 125641

Es scheint, als hätten Sie die socket Modul als import socket . Daher socket ist das Modul. Sie müssen diese Zeile entweder ändern in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sowie jede andere Verwendung des socket Modul, oder ändern Sie die Import-Anweisung in from socket import socket .

Oder Sie haben eine import socket nach Ihrem 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

0 Stimmen

Ich habe socket importiert als: from socket import * Ich kann es ändern, aber es wird eine Weile dauern, also zögere ich.

0 Stimmen

@user Sie haben wahrscheinlich später irgendwo eine import socket die das Modul importieren wird socket Überschreiben der Klasse socket . Siehe Codeschnipsel in Bearbeiten.

4 Stimmen

@user: Sie sollten es ändern. Der Grund from <...> import * Einfuhren sind schlecht, schlecht, schlecht ist mehr oder weniger so: Normalerweise weiß man genau, was im globalen Namensraum steht, weil es genau das ist, was man dort abgelegt hat. Aber wenn Sie import * füllt man diesen Namespace mit allen möglichen Dingen, die andere Module definieren. In diesem Fall ist es unklar, wo der Name socket von - ist es das Modul oder etwas, das in diesem Modul definiert wurde? Wenn Sie immer verwenden. import socket ou from socket import socket haben Sie dieses Problem nicht, da Sie genau sehen können, welche Namen verwendet werden.

8voto

blackwind Punkte 182

Ich weiß, dass dieser Thread schon ein Jahr alt ist, aber das eigentliche Problem liegt in Ihrem Arbeitsverzeichnis.

Ich glaube, das Arbeitsverzeichnis ist C:\Users\Administrator\Documents\Mibot\oops\ . Bitte suchen Sie die Datei mit dem Namen socket.py in diesem Verzeichnis. Sobald Sie es gefunden haben, benennen Sie es um oder verschieben es. Wenn Sie Socket importieren, socket.py aus dem aktuellen Verzeichnis wird anstelle des socket.py aus dem Verzeichnis von Python. Ich hoffe, das hat geholfen :)

Anmerkung: Verwenden Sie niemals die Dateinamen aus dem Python-Verzeichnis, um den Dateinamen Ihres Programms zu speichern; dies führt zu Konflikten mit Ihren Programmen.

1 Stimmen

Dies ist auf jeden Fall eine Erwähnung wert. Ich habe nur eine schnelle Überprüfung mit Sockets versucht, also habe ich die Datei einfach benannt socket.py . Nun, das hat genau die gleiche Fehlermeldung verursacht. Diese Seite brachte mich auf die richtige Spur: python-notes.curiousefficiency.org/de/latest/python_concepts/

2voto

Stuart Moore Punkte 604

Hier ist ein möglicher zusätzlicher Randfall, über den ich gestolpert bin und der mich eine Weile verwirrt hat, ich hoffe, er hilft jemandem:

Unter some_module/a.py :

def a():
   pass

Unter some_module/b.py :

from . import a

def b():
   a()

Unter some_module/__init__.py :

from .b import b
from .a import a

main.py :

from some_module import b

b()

Denn wenn main.py b lädt, geht es über __init__.py die versucht zu laden b.py vor a.py . Das heißt, wenn b.py versucht zu laden a wird das Modul und nicht die Funktion abgerufen, d.h. Sie erhalten die Fehlermeldung module object is not callable

Die Lösung besteht hier darin, die Reihenfolge in some_module/__init__.py :

from .a import a
from .b import b

Oder, wenn dies eine zirkuläre Abhängigkeit erzeugen würde, ändern Sie Ihre Dateinamen so, dass sie nicht mit den Funktionen übereinstimmen, und laden Sie direkt aus den Dateien, anstatt sich auf die __init__.py

1voto

Luke Exton Punkte 3186

Bei der Konfiguration eines console_scripts-Einstiegspunkts in setup.py stellte ich fest, dass dieses Problem auftrat, wenn der Endpunkt ein Modul oder Paket war und nicht eine Funktion innerhalb des Moduls.

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

Zum Beispiel

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

Hätte sein sollen

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

Damit würde es sich auf eine aufrufbare Funktion und nicht auf das Modul selbst beziehen. Es scheint keinen Unterschied zu machen, ob das Modul eine if __name__ == '__main__': blockieren. Dadurch wird das Modul nicht aufrufbar.

0 Stimmen

Eine Alternative ist die Verwendung der scripts Parameter anstelle von entry_points

1voto

Ich hatte das gleiche Problem. Dann habe ich versucht, die from YourClass import YourClass

Ich habe gerade kopiert den gesamten Code von YourClass.py und führen Sie es auf den wichtigsten Code (oder aktuellen Code).es löste den Fehler

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X