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 diesen Fehler? Ich bin verwirrt.
Was müssen Sie wissen, um meine Frage zu beantworten?
Antworten:
socket
ist ein Modul, das die Klasse enthältsocket
.Sie müssen tun
socket.socket(...)
oderfrom socket import socket
:Dies ist, was die Fehlermeldung bedeutet:
Es heißt
module object is not callable
, dass Ihr Code ein Modulobjekt aufruft . Ein Modulobjekt ist die Art von Dingen, die Sie beim Importieren eines Moduls erhalten. Was Sie versucht haben, ist eine Klasse anzurufen innerhalb des Modulobjekts , das zufällig denselben Namen hat wie das Modul, das es enthält.Hier ist eine Möglichkeit, diese Art von Fehler logisch aufzuschlüsseln:
module object is not callable
. Python sagt mir, dass mein Code versucht, etwas aufzurufen, das nicht aufgerufen werden kann. Was versucht mein Code aufzurufen?"socket
. Das sollte aufrufbar sein! Ist die Variablesocket
so, wie ich denke?"print socket
quelle
print socket
Sie sehen, dass der Namesocket
ein Modul ist. Es muss irgendwo an dieses Modul gebunden sein ! Lesen Sie Ihren Code sorgfältig durch und ich bin sicher, Sie werden einenimport socket
oder mehrere sehen, bei denen Sie ihn nicht erwarten.socket.socket
war etwas verwirrend. Ich habe es einfach getanimport write_to_file
und dann, da die Methode, in der ich mich befand, denwrite_to_file.py
NamenwriteToTextFile
randwrite_to_file.writeToTextFile
Angenommen, der Inhalt von YourClass.py lautet:
Wenn du benutzt:
Auf diese Weise habe ich TypeError erhalten: Das Objekt 'module' kann nicht aufgerufen werden, wenn Sie dann versucht haben, es zu verwenden
YourClass()
.Aber wenn Sie verwenden:
oder verwenden
YourClass.YourClass()
, es funktioniert bei mir.quelle
Fügen Sie
__init__.py
in YourClassParentDir zum Haupt hinzu, z.Dann haben Sie eine Instanz Ihrer Klasse bereit, wenn Sie sie in ein anderes Skript importieren:
quelle
from .YourClass import YourClass
in der__init__.py
Datei sein?Hier ist ein weiteres Problem, das ich auch nach dem Lesen dieser Beiträge noch eine Weile gesehen habe. Ich habe ein Skript eingerichtet, um meine Python-Bin-Skripte aufzurufen. Ich bekam das Modul auch nicht aufrufbar.
Mein Zickzack war, dass ich Folgendes tat:
als mein Zack folgendes tun musste:
Überprüfen Sie zusammenfassend die Verschachtelung Ihres Pakets und Moduls.
Ich versuche, ein Skriptverzeichnis zu haben, das nicht die Erweiterung * .py hat, und trotzdem die Module 'bin' in mypackage / bin und diese haben die Erweiterung * .py. Ich bin neu in der Verpackung und versuche, den Standards zu folgen, während ich sie interpretiere. Also habe ich am Setup root:
Wenn dies nicht dem Standard entspricht, lassen Sie es mich bitte wissen.
quelle
Anscheinend haben Sie das
socket
Modul als importiertimport socket
. Dahersocket
ist das Modul. Sie müssen entweder diese Zeile inself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sowie jede andere Verwendung dessocket
Moduls ändern oder die Importanweisung in ändernfrom socket import socket
.Oder du hast ein
import socket
nach deinemfrom socket import *
:quelle
import socket
, die das Modul importiert, dassocket
die Klasse überschreibtsocket
. Siehe Code-Snippet in Bearbeitung.from <...> import *
Importe schlecht, schlecht, schlecht sind, ist mehr oder weniger folgender: Normalerweise wissen Sie genau, was sich im globalen Namespace befindet, weil es genau das ist, was Sie dort abgelegt haben. Aber wenn Sieimport *
, füllen Sie diesen Namespace mit allen möglichen Dingen, die andere Module definieren. In diesem Fall ist unklar, woher der Namesocket
stammt - ist es das Modul oder etwas, das in diesem Modul definiert ist? Wenn Sie immer verwenden ,import socket
oderfrom socket import socket
, werden Sie nie dieses Problem haben, da Sie genau sehen können , welche Namen in Gebrauch sind.Ich weiß, dass dieser Thread ein Jahr alt ist, aber das eigentliche Problem liegt in Ihrem Arbeitsverzeichnis.
Ich glaube, dass das Arbeitsverzeichnis ist
C:\Users\Administrator\Documents\Mibot\oops\
. Bitte überprüfen Sie diesocket.py
in diesem Verzeichnis genannte Datei . Wenn Sie es gefunden haben, benennen Sie es um oder verschieben Sie es. Wenn Sie Socket importieren,socket.py
wird anstelle dessocket.py
Python-Verzeichnisses das aktuelle Verzeichnis verwendet . Hoffe das hat geholfen. :) :)Hinweis: Verwenden Sie niemals die Dateinamen aus dem Python-Verzeichnis, um den Dateinamen Ihres Programms zu speichern. es wird mit Ihren Programmen in Konflikt stehen.
quelle
socket.py
. Nun, das verursachte genau die gleiche Fehlermeldung. Diese Seite brachte mich auf den richtigen Weg: python-notes.curiousefficiency.org/en/latest/python_concepts/…Beim Konfigurieren eines console_scripts-Einstiegspunkts in setup.py stellte ich fest, dass dieses Problem auftrat, wenn der Endpunkt ein Modul oder Paket und keine Funktion innerhalb des Moduls war.
Zum Beispiel
Gewesen sein sollte
Damit würde es sich eher auf eine aufrufbare Funktion als auf das Modul selbst beziehen. Es scheint keinen Unterschied zu machen, ob das Modul einen
if __name__ == '__main__':
Block hat. Dadurch wird das Modul nicht aufrufbar.quelle
Ich denke, Sie haben die eingebaute Funktion / Variable oder etwas anderes "Modul" überschrieben, indem Sie die globale Variable "Modul" gesetzt haben. Drucken Sie einfach das Modul aus und sehen Sie, was darin enthalten ist.
quelle
Überprüfen Sie die Importanweisungen, da ein Modul nicht aufrufbar ist. In Python ist alles (einschließlich Funktionen, Methoden, Module, Klassen usw.) ein Objekt.
quelle
Eine einfache Möglichkeit, dieses Problem zu lösen, besteht darin, die
PYTHONPATH
variable Umgebung zu exportieren . Zum Beispiel für Python 2.6 unter Debian / GNU Linux:In anderen Betriebssystemen finden Sie zuerst den Speicherort dieses Moduls oder der
socket.py
Datei.quelle