TypeError: Das Objekt 'module' kann nicht aufgerufen werden

543
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?

user551717
quelle
8
Ich habe diesen Fehler einmal erhalten, weil ich sowohl eine (globale) Variable als auch eine Funktion mit demselben Namen hatte.
Remustata

Antworten:

563

socketist ein Modul, das die Klasse enthält socket.

Sie müssen tun socket.socket(...)oder 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'>

Dies ist, was die Fehlermeldung bedeutet:
Es heißtmodule 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?"
  • "Der Code versucht aufzurufen socket . Das sollte aufrufbar sein! Ist die Variablesocket so, wie ich denke?"
  • Ich sollte ausdrucken, was Steckdose ist und überprüfen print socket
Katriel
quelle
Ich importiere derzeit Socket wie folgt: vom Socket-Import *
user551717
Ich habe es auch von Socket-Import-Socket geändert und erhalte immer noch den gleichen Fehler.
user551717
@user: Wenn Sie dies tun, werden print socketSie sehen, dass der Name socketein Modul ist. Es muss irgendwo an dieses Modul gebunden sein ! Lesen Sie Ihren Code sorgfältig durch und ich bin sicher, Sie werden einen import socketoder mehrere sehen, bei denen Sie ihn nicht erwarten.
Katriel
2
Ohh ich verstehe. Das socket.socketwar etwas verwirrend. Ich habe es einfach getan import write_to_fileund dann, da die Methode, in der ich mich befand, den write_to_file.pyNamen writeToTextFilerandwrite_to_file.writeToTextFile
maudulus
9
Es ist erwähnenswert, dass dies für mindestens 133 Personen, die sich Zeit für die Abstimmung genommen haben (ich selbst eingeschlossen), die dies nicht verstanden haben, nicht offensichtlich war. Jetzt ist es offensichtlich, und wenn ich das nächste Mal in meine Toolbox greife, werde ich dieses Tool finden, wenn ein Modul als "nicht aufrufbar" gemeldet wird. Der Einstieg in eine neue Sprache ist der schwierigste Teil.
jmort253
168

Angenommen, der Inhalt von YourClass.py lautet:

class YourClass:
    # ......

Wenn du benutzt:

from YourClassParentDir import YourClass  # means YourClass.py

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:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

oder verwenden YourClass.YourClass(), es funktioniert bei mir.

Brad
quelle
2
class = YourClass.YourClass ()
KunMing Xie
2
Ich habe dieses Problem mithilfe von yourClass import * gelöst
Keith
104

Fügen Sie __init__.pyin YourClassParentDir zum Haupt 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
Jose Alban
quelle
5
Sollte es nicht from .YourClass import YourClass in der __init__.pyDatei sein?
Nicolas Seiller
28

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:

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

als mein Zack folgendes tun musste:

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

Ü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:

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

Wenn dies nicht dem Standard entspricht, lassen Sie es mich bitte wissen.

Nullocog
quelle
22

Anscheinend haben Sie das socketModul als importiert import socket. Daher socketist das Modul. Sie müssen entweder diese Zeile in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sowie jede andere Verwendung des socketModuls ändern oder die Importanweisung in ändern from socket import socket.

Oder du hast ein import socketnach deinem 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
Moinudin
quelle
Ich habe Socket importiert als: vom Socket-Import * Ich kann es ändern, aber es wird eine Weile dauern, also zögere ich es.
user551717
@user Du hast wahrscheinlich später irgendwo eine import socket, die das Modul importiert, das socketdie Klasse überschreibt socket. Siehe Code-Snippet in Bearbeitung.
Moinudin
3
@user: du solltest es ändern. Der Grund, warum 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 Sie import *, füllen Sie diesen Namespace mit allen möglichen Dingen, die andere Module definieren. In diesem Fall ist unklar, woher der Name socketstammt - ist es das Modul oder etwas, das in diesem Modul definiert ist? Wenn Sie immer verwenden , import socketoder from socket import socket, werden Sie nie dieses Problem haben, da Sie genau sehen können , welche Namen in Gebrauch sind.
Katriel
okay. Danke für den Tipp. Ich habe mich gerade an viele Tutorials gewöhnt.
Benutzer551717
7

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 die socket.pyin diesem Verzeichnis genannte Datei . Wenn Sie es gefunden haben, benennen Sie es um oder verschieben Sie es. Wenn Sie Socket importieren, socket.pywird anstelle des socket.pyPython-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.

schwarzer Wind
quelle
1
Dies ist definitiv erwähnenswert. Ich habe nur versucht, eine schnelle Überprüfung mit Sockets durchzuführen, also habe ich die Datei einfach benannt 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/…
Czechnology
0

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.

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 __name__ == '__main__':Block hat. Dadurch wird das Modul nicht aufrufbar.

Luke Exton
quelle
0

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.

umairhhhs
quelle
0

Überprüfen Sie die Importanweisungen, da ein Modul nicht aufrufbar ist. In Python ist alles (einschließlich Funktionen, Methoden, Module, Klassen usw.) ein Objekt.

Ayesha Siddiqa
quelle
-1

Eine einfache Möglichkeit, dieses Problem zu lösen, besteht darin, die PYTHONPATHvariable Umgebung zu exportieren . Zum Beispiel für Python 2.6 unter Debian / GNU Linux:

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

In anderen Betriebssystemen finden Sie zuerst den Speicherort dieses Moduls oder der socket.pyDatei.

Oscar Ardila
quelle