TypeError: วัตถุ 'โมดูล' ไม่สามารถเรียกได้


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

เหตุใดฉันจึงได้รับข้อผิดพลาดนี้ ฉันสับสน

คุณต้องรู้อะไรบ้างเพื่อตอบคำถามของฉัน


8
ฉันเคยได้รับข้อผิดพลาดนี้เพราะฉันมีทั้งตัวแปร (ทั่วโลก) และฟังก์ชั่นที่มีชื่อเดียวกัน
remustata

คำตอบ:


563

socketsocketเป็นโมดูลที่มีชั้นเรียน

คุณต้องทำ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 object is not callable อะไรคือสิ่งที่รหัสของฉันพยายามที่จะโทร?"
  • "รหัสกำลังพยายามโทรออกsocketซึ่งควรเรียกได้! ตัวแปรsocketนี้เป็นสิ่งที่ฉันคิดหรือไม่"
  • ฉันควรพิมพ์ว่าซ็อกเก็ตคืออะไรและตรวจสอบ print socket

ขณะนี้ฉันเป็นซ็อกเก็ตที่สำคัญเช่นนี้จากการนำเข้าซ็อกเก็ต *
user551717

ฉันเปลี่ยนจากซ็อกเก็ตนำเข้าซ็อกเก็ตและฉันยังคงได้รับข้อผิดพลาดเดียวกัน
user551717

@user: ถ้าคุณทำprint socketคุณจะเห็นว่าชื่อsocketเป็นโมดูล จะต้องมีการผูกพันกับโมดูลนั้นที่ไหนสักแห่ง ! อ่านรหัสของคุณอย่างถี่ถ้วนและฉันมั่นใจว่าคุณจะเห็นสิ่งimport socketที่คุณไม่คาดหวัง
Katriel

2
โอ้ฉันเข้าใจแล้ว เดอะsocket.socketสับสนเล็กน้อย ฉันก็ทำimport write_to_fileแล้วตั้งแต่วิธีที่ฉันใช้ภายในwrite_to_file.pyเป็นชื่อwriteToTextFileฉันก็แรนด์write_to_file.writeToTextFile
maudulus

9
เป็นที่น่าสังเกตว่าสิ่งนี้ไม่ชัดเจนสำหรับคนอย่างน้อย 133 คนที่ใช้เวลาในการโหวต (รวมตัวเอง) ซึ่งไม่เข้าใจเรื่องนี้ ตอนนี้เป็นที่ชัดเจนและครั้งต่อไปที่ฉันไปถึงในกล่องเครื่องมือของฉันฉันจะพบเครื่องมือนี้เมื่อโมดูลถูกรายงานว่า "ไม่สามารถโทรได้" การเริ่มต้นใช้ภาษาใหม่เป็นส่วนที่ยากที่สุด
jmort253

168

สมมติว่าเนื้อหาของYourClass.pyคือ:

class YourClass:
    # ......

ถ้าคุณใช้:

from YourClassParentDir import YourClass  # means YourClass.py

ด้วยวิธีนี้ผมได้TypeError: วัตถุ 'โมดูล' ไม่ callableYourClass()ถ้าคุณแล้วพยายามที่จะใช้

แต่ถ้าคุณใช้:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

หรือใช้งานYourClass.YourClass()ได้ผลสำหรับฉัน


2
class = YourClass.YourClass ()
KunMing Xie

2
ฉันแก้ไขปัญหานี้โดยใช้จากการนำเข้าคลาสของคุณ *
Keith

104

เพิ่มไปยังหลัก__init__.pyใน YourClassParentDir เช่น:

from .YourClass import YourClass

จากนั้นคุณจะมีอินสแตนซ์ของคลาสของคุณพร้อมเมื่อคุณนำเข้าสู่สคริปต์อื่น:

from YourClassParentDir import YourClass

5
ไม่ควรอยู่ from .YourClass import YourClass ใน__init__.pyไฟล์?
Nicolas Seiller

28

ที่นี่ gotcha อีกอันหนึ่งที่พาฉันไปสักครู่เพื่อดูแม้หลังจากอ่านบทความเหล่านี้ ฉันกำลังตั้งค่าสคริปต์เพื่อเรียกสคริปต์ไพ ธ อนของฉัน ฉันได้รับโมดูลไม่ callable เกินไป

ซิกแซกของฉันคือฉันกำลังทำต่อไปนี้:

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

เมื่อแซกของฉันต้องการทำสิ่งต่อไปนี้:

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

โดยสรุปให้ตรวจสอบแพ็กเกจและการซ้อนโมดูลของคุณอีกครั้ง

สิ่งที่ฉันพยายามทำคือมีไดเรกทอรีสคริปต์ที่ไม่มีนามสกุล * .py และยังคงมีโมดูล 'bin' อยู่ใน mypackage / bin และสิ่งเหล่านี้มีนามสกุล * .py ของฉัน ฉันยังใหม่กับการทำบรรจุภัณฑ์และพยายามที่จะปฏิบัติตามมาตรฐานในขณะที่ฉันกำลังตีความมัน ดังนั้นฉันมีที่รากติดตั้ง:

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

หากไม่เป็นไปตามมาตรฐานโปรดแจ้งให้เราทราบ


22

ดูเหมือนว่าสิ่งที่คุณทำจะนำเข้าโมดูลเป็นsocket import socketดังนั้นsocketเป็นโมดูล คุณอาจจำเป็นต้องเปลี่ยนสายที่self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)เช่นเดียวกับการใช้งานทุกครั้งอื่น ๆ ของโมดูลหรือเปลี่ยนแปลงคำสั่งการนำเข้าsocketfrom 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

ฉันนำเข้าซ็อกเก็ตเป็น: จากการนำเข้าซ็อกเก็ต * ฉันสามารถเปลี่ยนได้ แต่จะใช้เวลาสักครู่ดังนั้นฉันจึงลังเล
user551717

@user คุณอาจภายหลังที่ไหนสักแห่งเตรียมพร้อมimport socketที่จะนำเข้าโมดูลเอาชนะชั้นเรียนsocket socketดูข้อมูลโค้ดในการแก้ไข
moinudin

3
@user: คุณควรเปลี่ยน เหตุผลที่from <...> import *การนำเข้านั้นไม่ดีไม่ดีไม่ดีนั้นมากหรือน้อย: โดยปกติแล้วคุณจะรู้ว่าอะไรอยู่ในเนมสเปซส่วนกลางเพราะมันเป็นสิ่งที่คุณใส่ แต่เมื่อคุณimport *คุณต้องเติมเนมสเปซนั้นด้วยเนื้อหาทุกประเภทที่โมดูลอื่นกำหนด ในกรณีนี้มันไม่ชัดเจนที่socketมาจากชื่อ- มันเป็นโมดูลหรือสิ่งที่กำหนดไว้ในโมดูลนั้นหรือไม่? หากคุณมักจะใช้import socketหรือfrom socket import socketคุณจะไม่เคยมีปัญหานี้เนื่องจากคุณสามารถดูว่าสิ่งที่ชื่อในการใช้งาน
Katriel

ตกลง. ขอบคุณสำหรับทิป. ฉันเพิ่งติดนิสัยจากบทเรียนมากมาย
user551717

7

ฉันรู้ว่าหัวข้อนี้มีอายุหนึ่งปี แต่ปัญหาที่แท้จริงอยู่ในไดเรกทอรีการทำงานของคุณ

C:\Users\Administrator\Documents\Mibot\oops\ผมเชื่อว่าไดเรกทอรีการทำงานคือ โปรดตรวจสอบไฟล์ที่มีชื่อsocket.pyในไดเรกทอรีนี้ เมื่อคุณพบแล้วให้เปลี่ยนชื่อหรือย้าย เมื่อคุณนำเข้าซ็อกเก็ตsocket.pyจากไดเรกทอรีปัจจุบันจะใช้แทนsocket.pyไดเรกทอรีจาก Python หวังว่านี่จะช่วยได้ :)

หมายเหตุ:ห้ามใช้ชื่อไฟล์จากไดเรกทอรี Python เพื่อบันทึกชื่อไฟล์ของโปรแกรมของคุณ มันจะขัดแย้งกับโปรแกรมของคุณ


1
นี่เป็นสิ่งที่ควรค่าแก่การสังเกต socket.pyฉันก็แค่พยายามตรวจสอบอย่างรวดเร็วกับซ็อกเก็ตดังนั้นฉันแค่ชื่อไฟล์ นั่นเป็นสาเหตุของข้อความแสดงข้อผิดพลาดเดียวกันนี้ หน้านี้ทำให้ฉันอยู่ในเส้นทางที่ถูกต้อง: python-notes.curiousefficiency.org/en/latest/python_concepts/…
Czechnology

0

เมื่อกำหนดค่าจุดเข้า console_scripts ใน setup.py ฉันพบปัญหานี้แล้วเมื่อปลายทางเป็นโมดูลหรือแพ็กเกจแทนที่จะเป็นฟังก์ชันภายในโมดูล

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

ตัวอย่างเช่น

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

ควรได้รับ

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

เพื่อที่จะอ้างถึงฟังก์ชั่น callable แทนโมดูลเอง ดูเหมือนว่าจะไม่สร้างความแตกต่างถ้าโมดูลมีif __name__ == '__main__':บล็อก สิ่งนี้จะไม่ทำให้โมดูล callable


0

ฉันเดาว่าคุณได้แทนที่ฟังก์ชัน builtin / variable หรืออย่างอื่น "module" โดยการตั้งค่า global variable "module" เพียงพิมพ์โมดูลดูว่ามีอะไรอยู่ในนั้น


0

ตรวจสอบคำสั่งการนำเข้าเนื่องจากโมดูลไม่สามารถเรียกใช้ได้ ใน Python ทุกอย่าง (รวมถึงฟังก์ชั่นวิธีการโมดูลคลาส ฯลฯ ) เป็นวัตถุ


-1

วิธีง่ายๆในการแก้ไขปัญหานี้คือการส่งออกPYTHONPATHตัวแปรสภาพแวดล้อม ตัวอย่างเช่นสำหรับ Python 2.6 ใน Debian / GNU Linux:

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

ในระบบปฏิบัติการอื่นคุณจะพบตำแหน่งของโมดูลนี้หรือsocket.pyไฟล์ก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.