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?
socket
ist ein Modul, das die Klasse socket
enthält.
Sie müssen socket.socket(...)
oder from socket import socket
tun:
>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>
Beachten Sie, dass der Fehler hier sehr einfach zu verstehen ist: Wenn module object is not callable
, rufen Sie wahrscheinlich ein Modulobjekt auf! Was ist ein Modulobjekt? Dies ist die Art von Dingen, die Sie erhalten, wenn Sie ein Modul importieren.
Aber selbst wenn Sie das nicht verstehen (was in Ordnung ist, es ist oft verwirrend, dass Klassen, Module, Funktionen usw. alles nur Objekte wie alles andere sind), gibt es eine ziemlich einfache Möglichkeit, mit dem Debuggen zu beginnen:
module object is not callable
. Das klingt, als würde ich versuchen, etwas anzurufen, das Sie nicht anrufen können. Ich frage mich, was ich anrufen möchte?"socket
. Das sollte aufrufbar sein! Ich frage mich, ob die Variable socket
das ist, was ich denke, es ist?"print socket
Angenommen, der Inhalt von YourClass.py lautet:
class YourClass:
# ......
Wenn du benutzt:
from YourClassParentDir import YourClass # means YourClass.py
Auf diese Weise erhielt ich TypeError: 'Modul'-Objekt ist nicht aufrufbar, wenn Sie versucht haben, YourClass()
zu verwenden.
Aber wenn Sie verwenden:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
oder benutze YourClass.YourClass()
, es funktioniert für mich.
Fügen Sie dem Hauptcode __init__.py
in YourClassParentDir hinzu, z.
from .YourClass import YourClass
Dann haben Sie eine Instanz Ihrer Klasse bereit, wenn Sie sie in ein anderes Skript importieren:
from YourClassParentDir import YourClass
Hier ist noch eine andere Angelegenheit, die ich nach dem Lesen dieser Posts erst nach einiger Zeit gesehen habe. Ich habe ein Skript eingerichtet, um meine Python-Bin-Skripts aufzurufen. Ich bekam das Modul auch nicht aufrufbar.
Mein Zig war, dass ich folgendes tat:
from mypackage.bin import myscript
...
myscript(...)
wenn mein zag folgendes tun musste:
from mypackage.bin.myscript import myscript
...
myscript(...)
Zusammenfassend überprüfen Sie Ihr Paket und die Verschachtelung der Module.
Was ich versuche zu tun, ist ein Skriptverzeichnis, das nicht die Erweiterung * .py hat, und noch die 'bin'-Module in mypackage/bin und diese haben meine * .py-Erweiterung. Ich bin neu im Verpacken und versuche, den Standards zu folgen, wenn ich sie interpretiere. Also ich habe beim Setup root:
setup.py
scripts/
script1
mypackage/
bin/
script1.py
subpackage1/
subpackage_etc/
Wenn dies nicht dem Standard entspricht, lass es mich wissen.
Es scheint, als hätten Sie das socket
-Modul als import socket
importiert. Daher ist socket
das Modul. Sie müssen entweder diese Zeile in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sowie jede andere Verwendung des Moduls socket
ändern oder die Importanweisung in from socket import socket
ändern.
Oder Sie haben einen 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
Ich weiß, dass dieser Thread ein Jahr alt ist, aber das eigentliche Problem liegt in Ihrem Arbeitsverzeichnis.
Ich glaube, dass das Arbeitsverzeichnis C:\Users\Administrator\Documents\Mibot\oops\
ist. Bitte überprüfen Sie die Datei mit dem Namen socket.py
in diesem Verzeichnis. Wenn Sie es gefunden haben, benennen Sie es um oder verschieben Sie es. Wenn Sie Socket importieren, wird socket.py
aus dem aktuellen Verzeichnis anstelle von socket.py
aus dem Python-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 kollidieren.
Bei der Konfiguration eines Console_scripts-Entrypoint in setup.py wurde dieses Problem festgestellt, wenn der Endpunkt ein Modul oder Paket war und keine 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]
},
# ...
)
Gewesen sein sollte
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule:main]
},
# ...
)
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 __== '__main__':
-Block hat. Dadurch wird das Modul nicht aufrufbar.
Ich denke, Sie haben die eingebaute Funktion/Variable oder etwas anderes "Modul" durch Setzen der globalen Variablen "Modul" überschrieben. Drucken Sie einfach das Modul aus und sehen Sie, was darin enthalten ist.
Ein einfacher Weg, um dieses Problem zu lösen, ist das Exportieren der UmgebungsvariablePYTHONPATH
. Zum Beispiel für Python 2.6 in Debian/GNU Linux:
export PYTHONPATH=/usr/lib/python2.6`
In anderen Betriebssystemen würden Sie zuerst den Speicherort dieses Moduls oder die socket.py
-Datei finden.