TypeError:“模块”对象不可调用


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

Answers:


562

socket是一个包含class的模块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

我目前正在这样插入套接字:from socket import *
user551717 2010年

我也将其更改为从套接字导入套接字,但仍然遇到相同的错误。
user551717 2010年

@user:如果这样做,print socket您会看到名称socket是一个模块。它必须已绑定到该模块的某个地方!仔细阅读您的代码,我确定您会import socket在不期望的地方看到一个或多个。
卡特里尔2010年

2
哦,我明白了。该socket.socket有点混乱。我只是简单地做了import write_to_file,然后,因为我在其中使用的方法被write_to_file.py命名为writeToTextFileI randwrite_to_file.writeToTextFile
maudulus 2014年

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()
谢昆明

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

这是另一个陷阱,即使阅读了这些帖子,我也花了一段时间。我正在设置一个脚本来调用我的python bin脚本。我也无法调用该模块。

我的字形是我正在执行以下操作:

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/

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


22

看来您完成的操作是将socket模块导入为import socket。因此socket是模块。您或者需要将该行更改为self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM),以及将该socket模块的所有其他用法更改为1,或者将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

我已经将socket导入为:from socket import *我可以更改它,但是要花一些时间,所以我不愿意。
user551717 2010年

@user您可能稍后在某处找到了一个import socket,它将导入socket覆盖该类的模块socket。请参阅编辑中的代码段。
moinudin

3
@user:您应该更改它。from <...> import *导入不良,不良,不良的原因或多或少是这样的:通常,您确切地知道全局名称空间中的内容,因为它正是您所放置的内容。但是,当您使用时import *,您会使用其他模块定义的各种内容填充该名称空间。在这种情况下,不清楚名称的socket来源-是模块还是该模块中定义的内容?如果您始终使用import socketfrom socket import socket,则永远不会出现此问题,因为您可以确切地看到正在使用的名称。
卡特里尔2010年

好的。谢谢你的提示。我刚从很多教程中养成了习惯。
user551717 2010年

7

我知道这个线程已经使用了一年,但是真正的问题出在您的工作目录中。

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

注意:切勿使用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”来覆盖了内置函数/变量或其他“ module”。只需打印模块,看看其中有什么。



-1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.