TypeError: objek 'module' tidak dapat dipanggil

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

Mengapa saya mendapatkan kesalahan ini? Saya bingung.

Apa yang perlu Anda ketahui untuk menjawab pertanyaan saya?

user551717
sumber
8
Saya pernah mendapatkan kesalahan ini karena saya memiliki variabel (global) dan fungsi dengan nama yang sama.
remustata

Jawaban:

563

socketadalah modul, yang berisi kelas socket.

Anda perlu melakukan socket.socket(...)atau 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'>

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?"
  • "Kode mencoba memanggil socket. Itu harus bisa dipanggil! Apakah variabelnya socketadalah apa yang saya pikirkan?`
  • Saya harus mencetak apa soket itu dan periksa print socket
Katriel
sumber
Saat ini saya adalah socket imporitng seperti ini: from socket import *
user551717
Saya juga mengubahnya ke dari soket impor soket dan saya masih mendapatkan kesalahan yang sama.
user551717
@ pengguna: jika Anda melakukannya, print socketAnda akan melihat bahwa namanya socketadalah modul. Itu pasti terikat pada modul itu di suatu tempat ! Baca kode Anda dengan hati-hati dan saya yakin Anda akan melihat import socketatau beberapa di mana Anda tidak mengharapkannya.
Katriel
2
Ohh, aku mengerti. Itu socket.socketagak membingungkan. Saya hanya melakukannya import write_to_filedan kemudian, karena metode yang saya gunakan di dalam write_to_file.pybernama writeToTextFilesaya hanya randwrite_to_file.writeToTextFile
maudulus
9
Perlu dicatat bahwa ini tidak jelas bagi setidaknya 133 orang yang mengambil waktu untuk memilih (termasuk saya) yang tidak mengerti ini. Sekarang, sudah jelas, dan lain kali saya meraih di kotak alat saya, saya akan menemukan alat ini ketika modul dilaporkan sebagai "tidak bisa dipanggil". Memulai dengan bahasa baru adalah bagian yang paling sulit.
jmort253
168

Asumsikan bahwa konten YourClass.py adalah:

class YourClass:
    # ......

Jika Anda menggunakan:

from YourClassParentDir import YourClass  # means YourClass.py

Dengan cara ini, saya mendapat objek TypeError: 'module' tidak dapat dipanggil jika Anda kemudian mencoba untuk menggunakan YourClass().

Tetapi, jika Anda menggunakan:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

atau gunakan YourClass.YourClass(), itu bekerja untuk saya.

Brad
sumber
2
class = YourClass.YourClass ()
KunMing Xie
2
Saya memecahkan masalah ini dengan menggunakan dari impor yourClass *
Keith
104

Tambahkan ke utama __init__.pydi YourClassParentDir, misalnya:

from .YourClass import YourClass

Kemudian, Anda akan memiliki instance kelas Anda siap ketika Anda mengimpornya ke skrip lain:

from YourClassParentDir import YourClass
Jose Alban
sumber
5
Bukankah seharusnya ada from .YourClass import YourClass di __init__.pyfile?
Nicolas Seiller
28

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:

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

ketika zag saya perlu melakukan hal berikut:

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

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:

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

Jika ini tidak sesuai dengan standar, harap beri tahu saya.

zerocog
sumber
22

Sepertinya yang telah Anda lakukan adalah mengimpor socketmodul sebagai import socket. Karena socketitu modulnya. Anda juga perlu mengubah jalur itu ke self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), serta setiap penggunaan socketmodul lainnya, atau mengubah pernyataan impor from socket import socket.

Atau Anda mendapatkan import socketsetelah Anda 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
sumber
Saya telah mengimpor soket sebagai: dari impor soket * Saya dapat mengubahnya, tetapi akan memakan waktu cukup lama, jadi saya enggan melakukannya.
user551717
@ pengguna Anda mungkin di suatu tempat nanti punya import socket , yang akan mengimpor modul yang socketmenimpa kelas socket. Lihat cuplikan kode di sunting.
moinudin
3
@ pengguna: Anda harus mengubahnya. Alasan mengapa 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 Anda import *, Anda mengisi namespace itu dengan segala macam hal yang didefinisikan modul lain. Dalam hal ini, tidak jelas dari mana nama socketitu berasal - apakah itu modul atau sesuatu yang didefinisikan dalam modul itu? Jika Anda selalu menggunakan import socketatau from socket import socket, Anda tidak akan pernah memiliki masalah ini, karena Anda dapat melihat dengan tepat nama apa yang digunakan.
Katriel
baik. Terima kasih atas tipnya. Saya baru saja terbiasa dengan banyak tutorial.
user551717
7

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 disebutkan socket.pydalam direktori ini. Setelah Anda menemukannya, ganti nama atau pindahkan. Ketika Anda mengimpor soket, socket.pydari direktori saat ini digunakan bukan dari socket.pydirektori 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.

angin hitam
sumber
1
Ini jelas patut dicatat. Saya hanya mencoba cek cepat dengan soket jadi saya hanya memberi nama file 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/…
Czechnology
0

Ketika mengkonfigurasi entrypoint console_scripts di setup.py saya menemukan masalah ini ada ketika titik akhir adalah modul atau paket daripada fungsi dalam modul.

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

Sebagai contoh

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

Seharusnya begitu

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

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.

Luke Exton
sumber
0

Saya kira Anda telah mengganti fungsi / variabel bawaan atau sesuatu yang lain "modul" dengan mengatur variabel global "modul". cukup cetak modul, lihat apa isinya.

umairhhhs
sumber
0

periksa pernyataan impor karena modul tidak dapat dipanggil. Dalam Python, semuanya (termasuk fungsi, metode, modul, kelas, dll.) Adalah objek.

Ayesha Siddiqa
sumber
-1

Cara sederhana untuk mengatasi masalah ini adalah mengekspor PYTHONPATHlingkungan variabel. Misalnya, untuk Python 2.6 di Debian / GNU Linux:

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

Di sistem operasi lain, Anda akan lebih dulu menemukan lokasi modul ini atau socket.pyfile.

Oscar Ardila
sumber