TypeError: Obiekt „module” nie jest wywoływalny

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

Dlaczego dostaję ten błąd? Jestem zmieszany.

Co musisz wiedzieć, aby odpowiedzieć na moje pytanie?

użytkownik551717
źródło
8
Raz dostałem ten błąd, ponieważ miałem zarówno zmienną (globalną), jak i funkcję o tej samej nazwie.
remustata

Odpowiedzi:

563

socketto moduł zawierający klasę socket.

Musisz zrobić socket.socket(...)lub 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'>

Oto, co oznacza komunikat o błędzie:
Mówi module object is not callable, ponieważ twój kod wywołuje obiekt modułu . Obiekt modułu to rodzaj rzeczy, którą dostajesz podczas importowania modułu. Próbujesz wywołać obiekt klasy w obiekcie modułu, który ma taką samą nazwę jak moduł, który go zawiera.

Oto sposób na logiczne rozbicie tego rodzaju błędu:

  • " module object is not callable. Python mówi mi, że mój kod próbuje wywołać coś, czego nie można wywołać. Jaki jest mój kod, który próbuje wywołać?"
  • „Kod próbuje się wywołać socket. To powinno być możliwe do wywołania ! Czy zmienna socketjest tym, co myślę?”
  • Powinienem wydrukować, co to jest gniazdo i sprawdzić print socket
Katriel
źródło
Obecnie jestem ważnym gniazdem w następujący sposób: z importu gniazd *
user551717
Zmieniłem też to z gniazda importu gniazd i nadal pojawia się ten sam błąd.
user551717,
@ użytkownik: jeśli to zrobisz print socket, zobaczysz, że nazwa socketto moduł. Musi być gdzieś związany z tym modułem ! Przeczytaj uważnie swój kod i jestem pewien, że zobaczysz import socketcoś takiego, gdzie się go nie spodziewasz.
Katriel
2
Och, rozumiem. To socket.socketbyło trochę mylące. Po prostu zrobiłem, import write_to_filea potem, ponieważ metoda, której użyłem w środku, write_to_file.pynazywa się writeToTextFile, po prostu randwrite_to_file.writeToTextFile
maudulus
9
Warto zauważyć, że nie było to oczywiste dla co najmniej 133 osób, które wzięły czas na podniesienie głosu (w tym ja), które tego nie rozumiały. Teraz jest oczywiste i następnym razem, gdy sięgnę do mojego zestawu narzędzi, znajdę to narzędzie, gdy moduł zostanie zgłoszony jako „nie do wywołania”. Rozpoczęcie pracy z nowym językiem to najtrudniejsza część.
jmort253
168

Załóżmy, że zawartość pliku YourClass.py to:

class YourClass:
    # ......

Jeśli użyjesz:

from YourClassParentDir import YourClass  # means YourClass.py

W ten sposób otrzymałem TypeError: obiekt „module” nie jest możliwy do wywołania, jeśli spróbujesz go użyć YourClass().

Ale jeśli użyjesz:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

lub użyj YourClass.YourClass(), to działa dla mnie.

Ćwiek
źródło
2
class = YourClass.YourClass ()
KunMing Xie
2
Rozwiązałem ten problem, korzystając z importu z twojej klasy *
Keith
104

Dodaj do głównego __init__.pyw YourClassParentDir, np .:

from .YourClass import YourClass

Następnie przygotujesz instancję swojej klasy, gdy zaimportujesz ją do innego skryptu:

from YourClassParentDir import YourClass
Jose Alban
źródło
5
Czy nie powinno być from .YourClass import YourClass w __init__.pypliku?
Nicolas Seiller,
28

Oto kolejna gotcha, którą zajęło mi trochę czasu, nawet po przeczytaniu tych postów. Konfigurowałem skrypt, aby wywoływał moje skrypty bin Pythona. Zrobiłem też moduł nie do wywołania.

Mój zig polegał na tym, że robiłem następujące rzeczy:

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

kiedy mój zag musiał wykonać następujące czynności:

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

Podsumowując, sprawdź dwukrotnie zagnieżdżanie pakietu i modułu.

To, co próbuję zrobić, to mieć katalog skryptów, który nie ma rozszerzenia * .py, i nadal ma moduły bin do mypackage / bin, a te mają moje rozszerzenie * .py. Jestem nowy w pakowaniu i staram się przestrzegać standardów podczas ich interpretacji. Mam więc w katalogu głównym instalacji:

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

Jeśli nie jest to zgodne ze standardem, daj mi znać.

zerocog
źródło
22

Wygląda na to, że to, co zrobiłeś, zostało zaimportowane socketjako moduł import socket. Dlatego socketjest to moduł. Musisz zmienić tę linię na self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), jak również każde inne użycie socketmodułu lub zmienić instrukcję importu na from socket import socket.

Lub masz import socketpo 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
źródło
Zaimportowałem gniazdo jako: z importu gniazda * Mogę to zmienić, ale zajmie to trochę czasu, więc jestem niechętny.
user551717,
@ użytkownik Prawdopodobnie później gdzieś masz import socket, który zaimportuje moduł socketprzesłaniający klasę socket. Zobacz fragment kodu w edycji.
moinudin
3
@ użytkownik: powinieneś to zmienić. Powód from <...> import *importu jest zły, zły, zły jest mniej więcej taki: zwykle wiesz dokładnie, co jest w globalnej przestrzeni nazw, ponieważ jest to dokładnie to, co tam umieściłeś. Ale kiedy to zrobisz import *, wypełnisz tę przestrzeń nazw różnymi rzeczami zdefiniowanymi przez inne moduły. W tym przypadku nie jest jasne, skąd socketpochodzi nazwa - czy to moduł, czy coś zdefiniowane w tym module? Jeśli zawsze używasz import socketlub from socket import socket, nigdy nie będziesz mieć tego problemu, ponieważ możesz dokładnie zobaczyć, jakie nazwy są w użyciu.
Katriel
w porządku. Dzięki za wskazówkę. Właśnie przyzwyczaiłem się z wielu samouczków.
user551717,
7

Wiem, że ten wątek ma rok, ale prawdziwy problem tkwi w twoim katalogu roboczym.

Uważam, że katalog roboczy to C:\Users\Administrator\Documents\Mibot\oops\. Sprawdź plik podany socket.pyw tym katalogu. Po znalezieniu zmień nazwę lub przenieś. Podczas importowania gniazda socket.pyzamiast bieżącego katalogu socket.pyPythona używany jest katalog bieżący . Mam nadzieję, że to pomogło. :)

Uwaga: Nigdy nie używaj nazw plików z katalogu Python, aby zapisać nazwę pliku swojego programu; spowoduje konflikt z twoim programem (programami).

czarny wiatr
źródło
1
To zdecydowanie warte odnotowania. Próbowałem tylko szybkiego sprawdzenia gniazd, więc po prostu nazwałem plik socket.py. To spowodowało ten sam komunikat o błędzie. Ta strona postawiła mnie na dobrej drodze: python-notes.curiousefficiency.org/en/latest/python_concepts/…
Czechnology
0

Podczas konfigurowania punktu wejścia script_scripts w setup.py znalazłem ten problem, gdy punktem końcowym był moduł lub pakiet, a nie funkcja w module.

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

Na przykład

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

Powinien był być

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

Tak, aby odnosiło się to do funkcji wywoływalnej, a nie do samego modułu. Wydaje się, że nie ma znaczenia, czy moduł ma if __name__ == '__main__':blok. Nie spowoduje to wywołania modułu.

Luke Exton
źródło
0

Chyba przesłoniłeś wbudowaną funkcję / zmienną lub coś innego „moduł”, ustawiając zmienną globalną „moduł”. po prostu wydrukuj moduł i zobacz, co w nim jest.

umairhhhs
źródło
0

sprawdź instrukcje importu, ponieważ moduł nie jest wywoływalny. W Pythonie wszystko (w tym funkcje, metody, moduły, klasy itp.) Jest przedmiotem.

Ayesha Siddiqa
źródło
-1

Prostym sposobem rozwiązania tego problemu jest eksport PYTHONPATHśrodowiska zmiennego. Na przykład dla Python 2.6 w systemie Debian / GNU Linux:

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

W innych systemach operacyjnych najpierw znajdziesz lokalizację tego modułu lub socket.pypliku.

Oscar Ardila
źródło