关于python:typeerror:”module”对象不可调用

TypeError: 'module' object is not callable

1
2
3
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是一个包含类socket的模块。

您需要执行socket.socket(...)from socket import socket操作:

1
2
3
4
5
6
7
8
9
>>> 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


假设yourclass.py的内容是:

1
2
class YourClass:
    # ......

如果使用:

1
from YourClassParentDir import YourClass  # means YourClass.py

这样,我得到了typeerror:如果您试图使用YourClass(),那么"module"对象是不可调用的。

但是,如果您使用:

1
from YourClassParentDir.YourClass import YourClass   # means Class YourClass

或者用YourClass.YourClass(),它对我有用。


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

1
from .YourClass import YourClass

然后,当您将类的一个实例导入到另一个脚本中时,您就可以准备好它了:

1
from YourClassParentDir import YourClass


这是另一个发现,我花了一段时间看了这些文章。我正在设置一个脚本来调用我的python bin脚本。我得到的模块也不可调用。

我的意思是我在做以下事情:

1
2
3
from mypackage.bin import myscript
...
myscript(...)

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

1
2
3
from mypackage.bin.myscript import myscript
...
myscript(...)

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

我要做的是拥有一个没有扩展名为*.py的脚本目录,并且仍然有'bin'模块在mypackage/bin中,这些模块有我的扩展名为*.py。我对包装还不熟悉,在解释标准时,我会努力遵循这些标准。所以,我在安装根目录下有:

1
2
3
4
5
6
7
8
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),要么需要将该行更改为socket模块的所有其他用途,要么将import语句更改为from socket import socket

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

1
2
3
4
5
6
7
>>> 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时,将使用当前目录中的socket.py,而不是python目录中的socket.py。希望这有帮助。:)

注意:不要使用python目录中的文件名来保存程序的文件名;它将与您的程序冲突。


我想您已经通过设置全局变量"module"覆盖了内置函数/变量或其他"module"。只需打印模块即可查看其中的内容。


在setup.py中配置控制台脚本入口点时,我发现当端点是模块或包而不是模块中的函数时,存在此问题。

1
2
3
4
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

例如

1
2
3
4
5
6
7
8
from setuptools import setup
setup (
# ...
    entry_points = {
        'console_scripts': [mycli=package.module.submodule]
    },
# ...
)

应该是

1
2
3
4
5
6
7
8
from setuptools import setup
setup (
# ...
    entry_points = {
        'console_scripts': [mycli=package.module.submodule:main]
    },
# ...
)

这样它将引用可调用函数而不是模块本身。如果模块有一个if __name__ == '__main__':块,似乎没有什么区别。这不会使模块可调用。


解决这个问题的一个简单方法是导出thePYTHONPATH变量环境。例如,对于debian/gnu linux中的python 2.6:

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

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