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
Γιατί λαμβάνω αυτό το σφάλμα; Έχω μπερδευτεί.
Τι πρέπει να ξέρετε για να απαντήσετε στην ερώτησή μου;
Το socket
είναι μια ενότητα, που περιέχει την κλάση socket
.
Πρέπει να κάνετε socket.socket(...)
ή 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'>
Παρατηρήστε ότι το σφάλμα εδώ είναι αρκετά εύκολο να κατανοηθεί: αν το module object is not callable
, πιθανώς καλείτε ένα αντικείμενο module! Τι'είναι ένα αντικείμενο μονάδας; Είναι το είδος του πράγματος που παίρνετε όταν εισάγετε ένα module.
Αλλά ακόμα και αν δεν το καταλαβαίνετε αυτό (που δεν πειράζει, συχνά προκαλεί σύγχυση το γεγονός ότι οι κλάσεις, τα modules, οι συναρτήσεις κλπ. είναι όλα απλά αντικείμενα όπως όλα τα άλλα), υπάρχει ένας πολύ εύκολος τρόπος για να ξεκινήσετε τον εντοπισμό σφαλμάτων:
αντικείμενο της ενότητας δεν μπορεί να κληθεί
. Αυτό ακούγεται σαν να προσπαθώ να καλέσω κάτι που δεν μπορείτε να καλέσετε. Αναρωτιέμαι τι προσπαθώ να καλέσω; ",socket
. Αυτό θα έπρεπε να μπορεί να κληθεί! Αναρωτιέμαι αν η μεταβλητή socket
είναι αυτό που νομίζω ότι είναι;print socket
Φαίνεται ότι αυτό που κάνατε είναι να εισαγάγετε την ενότητα socket
ως import socket
. Επομένως, η socket
είναι η ενότητα. Πρέπει είτε να αλλάξετε αυτή τη γραμμή σε self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, καθώς και κάθε άλλη χρήση του module socket
, είτε να αλλάξετε τη δήλωση import σε from socket import socket
.
Ή έχετε ένα import socket
μετά το 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
Ξέρω ότι αυτό το νήμα είναι ενός έτους, αλλά το πραγματικό πρόβλημα βρίσκεται στον κατάλογο εργασίας σας.
Πιστεύω ότι ο κατάλογος εργασίας είναι C:\ \Users\Administrator\Documents\Mibot\oops\
. Ελέγξτε αν υπάρχει το αρχείο με όνομα socket.py
σε αυτόν τον κατάλογο. Μόλις το βρείτε, μετονομάστε το ή μετακινήστε το. Όταν κάνετε import socket, χρησιμοποιείται το socket.py
από τον τρέχοντα κατάλογο αντί του socket.py
από τον κατάλογο της Python's. Ελπίζω αυτό να βοήθησε :)
Σημείωση: Ποτέ μην χρησιμοποιείτε τα ονόματα αρχείων από τον κατάλογο της Python's για να αποθηκεύσετε το όνομα αρχείου του προγράμματός σας's. Θα έρθει σε σύγκρουση με το/τα πρόγραμμά σας.