source

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

gigabyte 2022. 9. 6. 22:19
반응형

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

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 「Module」, 「Module」을 하고 있습니다.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'>

에러 메시지의 의미는 다음과 같습니다.
it module object is not callable코드에서는 모듈오브젝트를 호출하고 있기 때문입니다.모듈 오브젝트는 모듈을 Import할 때 얻을 수 있는 유형입니다.이 작업은 모듈오브젝트 내에서 클래스 오브젝트를 호출하려고 했는데, 이 오브젝트를 포함하는 모듈과 이름이 같습니다.

이러한 에러를 논리적으로 분류하는 방법은 다음과 같습니다.

  • module object is not callablePython은 호출할 수 없는 것을 호출하려고 하고 있습니다.어디서든'?
  • 는 "코드가 "코드로 합니다.socket★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?socket어느 정도야?
  • 요.print socket

YourClass.py 의 내용은 다음과 같습니다.

class YourClass:
    # ......

다음을 사용하는 경우:

from YourClassParentDir import YourClass  # means YourClass.py

이렇게 하면 TypeError: 'module' 객체를 호출할 수 없습니다.YourClass().

단, 다음을 사용하는 경우:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

「」를 사용합니다.YourClass.YourClass() 합니다.그건 효과가 있다.

에 합니다.__init__.py예를 들어 다음과 같습니다.

from .YourClass import YourClass

그런 다음 클래스의 인스턴스를 다른 스크립트로 Import하면 해당 인스턴스가 준비됩니다.

from YourClassParentDir import YourClass

간단한 답변:실제 함수가 아닌 함수로 파일/디렉토리를 호출하고 있습니다.

읽어보기:

이러한 오류는 모듈을 함수로 간주하여 불러올 때 발생합니다.python 모듈에는 .py 파일이 있습니다.패키지(디렉토리)도 모듈로 간주할 수 있습니다.예를 들어 create.py 파일이 있다고 칩시다.이 파일에는 다음과 같은 기능이 있습니다.

#inside create.py
def create():
  pass

다른 코드 파일에서는, 다음과 같이 합니다.

#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here

이 에러는 함수로서 create.py 파일을 호출할 때 발생합니다.그래서 이걸 해야 해

from create import create
create() #now it works.

여기 또 다른 gotcha가 있는데, 이 글들을 읽고 나서도 보는 데 시간이 좀 걸렸어요.python bin 스크립트를 호출하기 위해 스크립트를 설정하고 있었습니다.나도 모듈을 호출할 수 없게 하고 있었어.

제 지그는 다음과 같은 일을 하고 있었습니다.

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

가 있을 때:

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

요약하면 패키지와 모듈의 네스팅을 재확인합니다.

스크립트 디렉토리는 확장자 *.py가 없고 mypackage/bin에 bin 모듈이 있고, 이것들은 확장자 *.py가 있습니다.저는 포장에 익숙하지 않기 때문에 해석할 때 기준을 따르려고 합니다.셋업 루트에는 다음과 같은 것이 있습니다.

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

만약 규격에 맞지 않으면 알려주세요.

당신이 한 일은 수입된 것 같습니다.socket로서 모듈화하다.import socket.그러므로socket는 모듈입니다.이 행을 다음과 같이 변경해야 합니다.self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), 및 기타 모든 용도는socketmodule 또는 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

이 스레드가 1년이 지난 건 알지만 진짜 문제는 작업 디렉토리에 있습니다.

작업 디렉토리는C:\Users\Administrator\Documents\Mibot\oops\파일명을 확인해 주세요.socket.py이 디렉토리에 있습니다.찾으면 이름을 바꾸거나 이동합니다.소켓을 Import할 때socket.pycurrent directory가 아닌socket.pyPython의 디렉토리에서.도움이 됐으면 좋겠네요.:)

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

setup.py에서 console_module 엔트리 포인트를 설정할 때 엔드포인트가 모듈 내의 함수가 아닌 모듈 또는 패키지일 때 이 문제가 발생했음을 알게 되었습니다.

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__':차단합니다. 그러면 모듈이 호출되지 않습니다.

저도 같은 문제에 직면했어요.그리고 나서 나는 그것을 사용하지 않으려고 노력했다.from YourClass import YourClass

YourClass.py의 코드를 모두 복사하여 메인 코드(또는 현재 코드)로 실행했습니다.그것은 오류를 해결했다

글로벌 변수 "module"을 설정하여 기본 함수/변수 또는 기타 "module"을 덮어쓰신 것 같습니다.모듈만 인쇄하면 됩니다.

여기 제가 우연히 발견해서 잠시 어리둥절했던 추가 케이스가 있습니다. 누군가에게 도움이 되길 바랍니다.

some_module/a.py:

def a():
   pass

some_module/b.py:

from . import a

def b():
   a()

some_module/__init__.py:

from .b import b
from .a import a

main.py:

from some_module import b

b()

그러면 main.py이 b를 로드하면 다음 경로를 통해__init__.py로드하려고 합니다.b.py전에a.py즉, 다음과 같은 경우b.py로드를 시도a기능이 아닌 모듈이 표시됩니다.즉, 에러 메시지가 표시됩니다.module object is not callable

여기서의 해결책은 주문을 교환하는 것입니다.some_module/__init__.py:

from .a import a
from .b import b

또는 순환 종속성을 생성할 경우 파일 이름을 함수와 일치하지 않도록 변경하고 에 의존하지 않고 파일에서 직접 로드합니다.__init__.py

이 문제를 해결하는 간단한 방법은,PYTHONPATH Linux의2경우 Debian/GNU Linux Python 2.6:

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

이 의 위치 를 .socket.pyfilename을 클릭합니다.

모듈을 호출할 수 없으므로 Import 문을 확인합니다.Python에서는 모든 것(함수, 메서드, 모듈, 클래스 등)이 객체입니다.

언급URL : https://stackoverflow.com/questions/4534438/typeerror-module-object-is-not-callable

반응형