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?
Odpowiedzi:
socket
to moduł zawierający klasęsocket
.Musisz zrobić
socket.socket(...)
lubfrom socket import socket
: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ć?"socket
. To powinno być możliwe do wywołania ! Czy zmiennasocket
jest tym, co myślę?”print socket
źródło
print socket
, zobaczysz, że nazwasocket
to moduł. Musi być gdzieś związany z tym modułem ! Przeczytaj uważnie swój kod i jestem pewien, że zobaczyszimport socket
coś takiego, gdzie się go nie spodziewasz.socket.socket
było trochę mylące. Po prostu zrobiłem,import write_to_file
a potem, ponieważ metoda, której użyłem w środku,write_to_file.py
nazywa sięwriteToTextFile
, po prostu randwrite_to_file.writeToTextFile
Załóżmy, że zawartość pliku YourClass.py to:
Jeśli użyjesz:
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:
lub użyj
YourClass.YourClass()
, to działa dla mnie.źródło
Dodaj do głównego
__init__.py
w YourClassParentDir, np .:Następnie przygotujesz instancję swojej klasy, gdy zaimportujesz ją do innego skryptu:
źródło
from .YourClass import YourClass
w__init__.py
pliku?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:
kiedy mój zag musiał wykonać następujące czynności:
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:
Jeśli nie jest to zgodne ze standardem, daj mi znać.
źródło
Wygląda na to, że to, co zrobiłeś, zostało zaimportowane
socket
jako modułimport socket
. Dlategosocket
jest to moduł. Musisz zmienić tę linię naself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, jak również każde inne użyciesocket
modułu lub zmienić instrukcję importu nafrom socket import socket
.Lub masz
import socket
pofrom socket import *
:źródło
import socket
, który zaimportuje modułsocket
przesłaniający klasęsocket
. Zobacz fragment kodu w edycji.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 zrobiszimport *
, wypełnisz tę przestrzeń nazw różnymi rzeczami zdefiniowanymi przez inne moduły. W tym przypadku nie jest jasne, skądsocket
pochodzi nazwa - czy to moduł, czy coś zdefiniowane w tym module? Jeśli zawsze używaszimport socket
lubfrom socket import socket
, nigdy nie będziesz mieć tego problemu, ponieważ możesz dokładnie zobaczyć, jakie nazwy są w użyciu.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 podanysocket.py
w tym katalogu. Po znalezieniu zmień nazwę lub przenieś. Podczas importowania gniazdasocket.py
zamiast bieżącego katalogusocket.py
Pythona 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).
źródło
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/…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.
Na przykład
Powinien był być
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.źródło
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.
źródło
sprawdź instrukcje importu, ponieważ moduł nie jest wywoływalny. W Pythonie wszystko (w tym funkcje, metody, moduły, klasy itp.) Jest przedmiotem.
źródło
Prostym sposobem rozwiązania tego problemu jest eksport
PYTHONPATH
środowiska zmiennego. Na przykład dla Python 2.6 w systemie Debian / GNU Linux:W innych systemach operacyjnych najpierw znajdziesz lokalizację tego modułu lub
socket.py
pliku.źródło