it-swarm.com.de

TypeError: 'Modul'-Objekt 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?

410
user551717

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:

  • "Hmm, 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?"
  • "Oh, ich rufe socket. Das sollte aufrufbar sein! Ich frage mich, ob die Variable socket das ist, was ich denke, es ist?"
  • print socket
437
Katriel

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.

96
Bowen Xu

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
84
Jose Alban

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.

25
zerocog

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
20
marcog

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.

7
blackwind

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. 

0
Luke Exton

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.

0
umairhhhs

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.

0
Oscar Ardila