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

为什么我会得到这个错误? 我很困惑。

你需要知道什么才能回答我的问题?

1913984 次浏览

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。Python告诉我我的代码试图调用无法调用的东西。我的代码试图调用什么?”
  • "代码试图调用socket。这应该是可调用的!变量socket是我认为的吗?'
  • 我应该打印出套接字是什么并检查print(socket)

看起来你所做的是将socket模块导入为import socket。因此socket是模块。你要么需要将该行更改为self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM),以及socket模块的其他使用,要么将导入语句更改为from socket import socket

或者你的from socket import *后面有一个import socket

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

我知道这个线程是一年前的,但真正的问题是在您的工作目录中。

我相信工作目录是C:\Users\Administrator\Documents\Mibot\oops\。请检查此目录中名为socket.py的文件。找到后,重命名或移动它。导入套接字时,使用当前目录中的socket.py而不是Python目录中的socket.py。希望这有帮助。:)

备注:永远不要使用Python目录中的文件名来保存程序的文件名;它会与您的程序冲突。

解决这个问题的一个简单方法是导出PYTHONPATH变量环境。例如,对于Debian/GNULinux中的Python 2.6:

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

在其他操作系统中,您将首先找到此模块或socket.py文件的位置。

这是另一个问题,即使在阅读了这些帖子之后,我也花了一段时间才看到。我正在设置一个脚本来调用我的python bin脚本。我也无法调用模块。

我的zig是我在做以下事情:

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

当我的zag需要执行以下操作时:

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

总之,仔细检查您的包和模块嵌套。

我想做的是有一个没有*. py扩展名的脚本目录,并且仍然有'bin'模块在mypack/bin中,这些模块有我的*. py扩展名。我是包装新手,并试图在解释它们时遵循标准。所以,我在安装根目录:

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

如果这不符合标准,请让我知道。

添加到主__init__.py在YourClassPanrtDir,例如:

from .YourClass import YourClass

然后,当您将类的实例导入另一个脚本时,您将准备好它:

from YourClassParentDir import YourClass

假设YourClass.py的内容是:

class YourClass:
# ......

如果您使用:

from YourClassParentDir import YourClass  # means YourClass.py

这样,如果您随后尝试调用YourClass(),您将获得TypeError:“模块”对象不可调用

但是,如果您使用:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

或者使用YourClass.YourClass(),它有效。

在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__':块,似乎没有区别。这不会使模块可调用。

我猜你已经通过设置全局变量“模块”覆盖了内置函数/变量或其他“模块”。只需打印模块,查看其中的内容。

检查导入语句,因为模块不可调用。 在Python中,一切(包括函数、方法、模块、类等)都是对象。

简短的回答:您正在调用文件/目录作为函数而不是实际函数

继续阅读:

当您导入模块并将其视为函数并调用它时,会发生这种错误。 所以在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.

我遇到了同样的问题。然后我试着不使用 from YourClass import YourClass

我只是复制了YourClass.py的整个代码并在主代码(或当前代码)上运行它

这是一个可能的额外边缘情况,我偶然发现并困惑了一段时间,希望它能帮助某人:

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尝试在a.py之前加载b.py。这意味着当b.py尝试加载a时,它会获得模块而不是函数-这意味着您将收到错误消息module object is not callable

这里的解决方案是在some_module/__init__.py中交换顺序:

from .a import a
from .b import b

或者,如果这会创建循环依赖关系,请更改文件名以与函数不匹配,并直接从文件加载,而不是依赖__init__.py

您正在使用模块的名称而不是类的名称 使用

import socket

然后

socket.socket(...)

这是一个奇怪的事情与模块,但你也可以使用类似

import socket as sock

然后使用

sock.socket(...)