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

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

如何解决这个错误?


当前回答

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

在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尝试加载一个对象时,它得到的是模块而不是函数——这意味着你将得到错误消息:模块对象不可调用

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

from .a import a
from .b import b

或者,如果这将创建一个循环依赖,请更改您的文件名,使其与函数不匹配,并直接从文件加载,而不是依赖__init__.py

其他回答

我也面临同样的问题。然后我试着不吸 导入你的类

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

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

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

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

当我的zag需要做以下事情:

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

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

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

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

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

当在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中,所有东西(包括函数、方法、模块、类等)都是对象。

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

下面是错误信息的含义: 它说模块对象是不可调用的,因为你的代码正在调用一个模块对象。模块对象是导入模块时获得的对象类型。您要做的是在模块对象中调用恰好与包含它的模块具有相同名称的类对象。

下面是一种逻辑上分解这类错误的方法:

"模块对象不可调用。Python告诉我,我的代码试图调用一些不能调用的东西。我的代码要调用什么?” "代码正在尝试调用套接字。这应该是可调用的!变量socket是我想的那样吗?` 我应该打印出socket,然后检查print(socket)