TypeError : 'module'개체를 호출 할 수 없습니다


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 2016 년

답변:


563

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 object is not callable. 파이썬은 호출 할 수없는 것을 호출하려고하는 코드를 알려줍니다. 호출하려는 코드는 무엇입니까?"
  • "코드가 호출을 시도하고 socket있습니다. 호출 할 수 있어야합니다! 변수 socket가 내가 생각하는 것입니까? '
  • 소켓이 무엇인지 인쇄하고 확인해야합니다. print socket

나는 현재 다음과 같이 소켓을 중요하게 생각한다 : from socket import *
user551717

또한 소켓 가져 오기 소켓에서 변경했는데 여전히 동일한 오류가 발생합니다.
user551717

@user : 그렇게 print socket하면 이름 socket이 모듈 이라는 것을 알 수 있습니다 . 어딘가에 해당 모듈에 바인딩되어 있어야합니다 ! 코드를주의 깊게 import socket읽으면 예상치 못한 부분 이 보일 것입니다.
Katriel

2
아 알 겠어 은 socket.socket조금 혼란이었다. 내가 그저 import write_to_file내부에서 사용하고 있던 방법의 write_to_file.py이름 writeToTextFile이 간단하기 때문에 나는 단순히 randwrite_to_file.writeToTextFile
maudulus

9
이것을 이해하지 못한 투표 (시간에 자신을 포함)에 시간을 투자 한 133 명 이상에게는 이것이 분명하지 않다는 점은 주목할 가치가 있습니다. 이제는 분명하고 다음에 툴박스에 도달하면 모듈이 "호출 할 수 없음"으로보고 될 때이 툴을 찾을 수 있습니다. 새로운 언어로 시작하는 것이 가장 어려운 부분입니다.
jmort253

168

YourClass.py 의 내용이 다음 과 같다고 가정하십시오 .

class YourClass:
    # ......

사용하는 경우 :

from YourClassParentDir import YourClass  # means YourClass.py

이런 식으로 TypeError : 'module'객체를 호출 할 수 없으면 호출 할 수 없습니다YourClass() .

그러나 다음을 사용하는 경우 :

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

또는 사용 YourClass.YourClass()하면 나를 위해 작동합니다.


2
class = YourClass.YourClass ()
KunMing Xie

2
yourClass import *를 사용하여이 문제를 해결했습니다.
Keith

104

__init__.pyYourClassParentDir 의 메인 에 추가하십시오 . 예 :

from .YourClass import YourClass

그런 다음 다른 스크립트로 가져올 때 클래스의 인스턴스를 준비합니다.

from YourClassParentDir import YourClass

5
파일에 포함 from .YourClass import YourClass 되어 있지 않아야 __init__.py합니까?
Nicolas Seiller

28

여기에이 게시물을 읽은 후에도 잠시 시간이 걸리는 또 다른 문제가 있습니다. 파이썬 빈 스크립트를 호출하는 스크립트를 설정하고있었습니다. 모듈을 호출 할 수 없게되었습니다.

내 지그는 내가 다음을하고 있다는 것이었다.

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

내 zag가 다음을 수행해야 할 때 :

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

요약하면 패키지 및 모듈 중첩을 다시 확인하십시오.

내가하려고하는 것은 * .py 확장자가없는 스크립트 디렉토리를 가지고 있으며 mypackage / bin에 '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)사용할 때마다 해당 줄을 로 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

소켓 가져 오기에서 소켓을 가져 왔습니다. * 소켓을 변경할 수 있지만 시간이 걸리므로 꺼려합니다.
user551717

@user 나중에 어딘가에 클래스를 재정의하는 import socket모듈을 가져옵니다 . 편집에서 코드 스 니펫을 참조하십시오. socketsocket
moinudin

3
@user : 변경해야합니다. from <...> import *수입이 나쁘거나 나쁘고 나쁘다 는 이유 는 이보다 더 많거나 적습니다. 일반적으로 전역 네임 스페이스에 무엇이 있는지 정확히 알고 있습니다. 그러나 import *, 다른 모듈이 정의한 모든 종류의 것들로 네임 스페이스를 채 웁니다. 이 경우 이름 socket이 어디에서 왔는지 확실하지 않습니다. 모듈입니까, 아니면 해당 모듈에 정의 된 것입니까? 당신이 경우 항상 사용 import socket하거나 from socket import socket정확히 사용에 어떤 이름을 볼 수 있기 때문에, 당신은이 문제가되지 않을 것입니다.
Katriel

괜찮아. 팁 고마워. 방금 많은 튜토리얼에서 습관을 얻었습니다.
user551717

7

나는이 스레드가 1 년 된 것을 알고 있지만 실제 문제는 작업 디렉토리에 있습니다.

작업 디렉토리는 C:\Users\Administrator\Documents\Mibot\oops\입니다. socket.py이 디렉토리에 이름 이 지정된 파일을 확인하십시오 . 찾으면 이름을 바꾸거나 이동하십시오. 소켓을 가져올 때 Python의 디렉토리 socket.py대신 현재 디렉토리에서 사용됩니다 socket.py. 이것이 도움이 되었기를 바랍니다. :)

참고 : Python의 디렉토리에서 파일 이름을 사용하여 프로그램의 파일 이름을 저장하지 마십시오. 프로그램과 충돌합니다.


1
이것은 주목할 가치가 있습니다. 방금 소켓으로 빠른 검사를 시도 했으므로 간단히 파일 이름을 지정했습니다 socket.py. 글쎄, 그게 정확히 같은 오류 메시지가 발생했습니다. 이 페이지는 바른 길에 나를 넣어 : python-notes.curiousefficiency.org/en/latest/python_concepts/...
Czechnology

0

setup.py에서 console_scripts 진입 점을 구성 할 때이 문제는 엔드 포인트가 모듈 내의 함수가 아닌 모듈 또는 패키지 일 때 발생했습니다.

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]
    },
# ...
)

따라서 모듈 자체가 아닌 호출 가능한 함수를 참조합니다. 모듈에 if __name__ == '__main__':블록 이 있으면 아무런 차이가없는 것 같습니다 . 이렇게하면 모듈을 호출 할 수 없습니다.


0

전역 변수 "module"을 설정하여 내장 함수 / 변수 또는 다른 "모듈"을 재정의 한 것 같습니다. 모듈을 인쇄하기 만하면됩니다.


0

모듈을 호출 할 수 없으므로 import 문을 확인하십시오. 파이썬에서 모든 것 (함수, 메소드, 모듈, 클래스 등)은 객체입니다.


-1

이 문제를 해결하는 간단한 방법은 PYTHONPATH변수 환경을 내보내는 것 입니다. 예를 들어, 데비안 / GNU Linux의 Python 2.6의 경우 :

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

다른 운영 체제에서는 먼저이 모듈 또는 socket.py파일 의 위치를 ​​찾습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.