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
Mengapa saya mendapatkan kesalahan ini? Saya bingung.
Apa yang perlu Anda ketahui untuk menjawab pertanyaan saya?
Jawaban:
socket
adalah modul, yang berisi kelassocket
.Anda perlu melakukan
socket.socket(...)
ataufrom socket import socket
:Inilah yang dimaksud pesan kesalahan:
Bunyinya
module object is not callable
, karena kode Anda memanggil objek modul . Objek modul adalah jenis barang yang Anda dapatkan saat mengimpor modul. Apa yang Anda coba lakukan adalah memanggil objek kelas di dalam objek modul yang kebetulan memiliki nama yang sama dengan modul yang berisi itu.Berikut adalah cara untuk secara logis memecah kesalahan semacam ini:
module object is not callable
. Python memberitahuku kode saya mencoba memanggil sesuatu yang tidak bisa dipanggil. Apa kode saya mencoba menelepon?"socket
. Itu harus bisa dipanggil! Apakah variabelnyasocket
adalah apa yang saya pikirkan?`print socket
sumber
print socket
Anda akan melihat bahwa namanyasocket
adalah modul. Itu pasti terikat pada modul itu di suatu tempat ! Baca kode Anda dengan hati-hati dan saya yakin Anda akan melihatimport socket
atau beberapa di mana Anda tidak mengharapkannya.socket.socket
agak membingungkan. Saya hanya melakukannyaimport write_to_file
dan kemudian, karena metode yang saya gunakan di dalamwrite_to_file.py
bernamawriteToTextFile
saya hanya randwrite_to_file.writeToTextFile
Asumsikan bahwa konten YourClass.py adalah:
Jika Anda menggunakan:
Dengan cara ini, saya mendapat objek TypeError: 'module' tidak dapat dipanggil jika Anda kemudian mencoba untuk menggunakan
YourClass()
.Tetapi, jika Anda menggunakan:
atau gunakan
YourClass.YourClass()
, itu bekerja untuk saya.sumber
Tambahkan ke utama
__init__.py
di YourClassParentDir, misalnya:Kemudian, Anda akan memiliki instance kelas Anda siap ketika Anda mengimpornya ke skrip lain:
sumber
from .YourClass import YourClass
di__init__.py
file?Ini adalah gotcha lain, yang membuat saya butuh waktu untuk melihat bahkan setelah membaca posting ini. Saya sedang menyiapkan skrip untuk memanggil skrip python bin saya. Saya mendapatkan modul tidak bisa dipanggil juga.
Zig saya adalah bahwa saya melakukan hal berikut:
ketika zag saya perlu melakukan hal berikut:
Singkatnya, periksa kembali paket Anda dan modul bersarang.
Apa yang saya coba lakukan adalah memiliki direktori skrip yang tidak memiliki ekstensi * .py, dan masih memiliki modul 'bin' di mypackage / bin dan ini memiliki ekstensi * .py saya. Saya baru mengepak, dan mencoba mengikuti standar ketika saya mengartikannya. Jadi, saya punya di root setup:
Jika ini tidak sesuai dengan standar, harap beri tahu saya.
sumber
Sepertinya yang telah Anda lakukan adalah mengimpor
socket
modul sebagaiimport socket
. Karenasocket
itu modulnya. Anda juga perlu mengubah jalur itu keself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, serta setiap penggunaansocket
modul lainnya, atau mengubah pernyataan imporfrom socket import socket
.Atau Anda mendapatkan
import socket
setelah Andafrom socket import *
:sumber
import socket
, yang akan mengimpor modul yangsocket
menimpa kelassocket
. Lihat cuplikan kode di sunting.from <...> import *
impor buruk, buruk, buruk kurang lebih ini: biasanya Anda tahu persis apa yang ada di ruang nama global, karena persis itulah yang Anda masukkan ke sana. Tetapi ketika Andaimport *
, Anda mengisi namespace itu dengan segala macam hal yang didefinisikan modul lain. Dalam hal ini, tidak jelas dari mana namasocket
itu berasal - apakah itu modul atau sesuatu yang didefinisikan dalam modul itu? Jika Anda selalu menggunakanimport socket
ataufrom socket import socket
, Anda tidak akan pernah memiliki masalah ini, karena Anda dapat melihat dengan tepat nama apa yang digunakan.Saya tahu utas ini berumur satu tahun, tetapi masalah sebenarnya ada di direktori kerja Anda.
Saya percaya bahwa direktori kerjanya adalah
C:\Users\Administrator\Documents\Mibot\oops\
. Silakan periksa file yang disebutkansocket.py
dalam direktori ini. Setelah Anda menemukannya, ganti nama atau pindahkan. Ketika Anda mengimpor soket,socket.py
dari direktori saat ini digunakan bukan darisocket.py
direktori Python. Semoga ini bisa membantu. :)Catatan: Jangan pernah menggunakan nama file dari direktori Python untuk menyimpan nama file program Anda; itu akan bertentangan dengan program Anda.
sumber
socket.py
. Nah, itu yang menyebabkan pesan kesalahan yang sama persis ini. Halaman ini menempatkan saya di jalur yang benar: python-notes.curiousefficiency.org/en/latest/python_concepts/…Ketika mengkonfigurasi entrypoint console_scripts di setup.py saya menemukan masalah ini ada ketika titik akhir adalah modul atau paket daripada fungsi dalam modul.
Sebagai contoh
Seharusnya begitu
Sehingga akan merujuk ke fungsi yang bisa dipanggil daripada modul itu sendiri. Tampaknya tidak ada bedanya jika modul memiliki
if __name__ == '__main__':
blok. Ini tidak akan membuat modul dapat dipanggil.sumber
Saya kira Anda telah mengganti fungsi / variabel bawaan atau sesuatu yang lain "modul" dengan mengatur variabel global "modul". cukup cetak modul, lihat apa isinya.
sumber
periksa pernyataan impor karena modul tidak dapat dipanggil. Dalam Python, semuanya (termasuk fungsi, metode, modul, kelas, dll.) Adalah objek.
sumber
Cara sederhana untuk mengatasi masalah ini adalah mengekspor
PYTHONPATH
lingkungan variabel. Misalnya, untuk Python 2.6 di Debian / GNU Linux:Di sistem operasi lain, Anda akan lebih dulu menemukan lokasi modul ini atau
socket.py
file.sumber