TypeError:'module'对象不可调用

时间:2010-12-26 15:56:50

标签: python sockets

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

为什么我收到此错误? 我很困惑。

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

12 个答案:

答案 0 :(得分:463)

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

答案 1 :(得分:108)

假设 YourClass.py 的内容为:

class YourClass:
    # ......

如果您使用:

from YourClassParentDir import YourClass  # means YourClass.py

通过这种方式,我得到了 TypeError:'模块'对象不可调用如果您之后尝试使用YourClass()

但是,如果您使用:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

或使用YourClass.YourClass(),它适用于我。

答案 2 :(得分:89)

添加到YourClassParentDir中的主__init__.py,例如:

from .YourClass import YourClass

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

from YourClassParentDir import YourClass

答案 3 :(得分:25)

这是另一个问题,即使在阅读这些帖子后,我也花了一些时间才看到。我正在设置一个脚本来调用我的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/

如果这不符合标准,请告诉我。

答案 4 :(得分:20)

您所做的似乎是将socket模块导入为import socket。因此socket是模块。您需要将该行更改为self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM),以及socket模块的其他所有用途,或将导入语句更改为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

答案 5 :(得分:15)

简短答案:您正在将文件/目录作为函数而不是实际函数进行调用

继续阅读:

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

希望有帮助!祝您编码愉快!

答案 6 :(得分:7)

我知道这个帖子已经有一年了,但真正的问题出在你的工作目录中。

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

注意:切勿使用Python目录中的文件名来保存程序的文件名;它会与你的程序发生冲突。

答案 7 :(得分:0)

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

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

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:-1)

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