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
为什么会出现此错误? 我糊涂了。
您需要知道什么才能回答我的问题?
#1楼
解决此问题的一种简单方法是导出PYTHONPATH
变量环境。 例如,对于Debian / GNU Linux中的Python 2.6:
export PYTHONPATH=/usr/lib/python2.6`
在其他操作系统中,您首先要找到该模块或socket.py
文件的位置。
#2楼
这是另一个陷阱,即使阅读了这些帖子,我也花了一段时间。 我正在设置一个脚本来调用我的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/
如果这不符合标准,请告诉我。
#3楼
添加到YourClassParentDir中的主要__init__.py
中,例如:
from .YourClass import YourClass
然后,将类导入另一个脚本时,将准备好该类的实例:
from YourClassParentDir import YourClass
#4楼
假设YourClass.py的内容是:
class YourClass:
# ......
如果您使用:
from YourClassParentDir import YourClass # means YourClass.py
这样,我得到TypeError:如果您随后尝试使用YourClass()
则无法调用'module'对象 。
但是,如果您使用:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
或使用YourClass.YourClass()
,它对我有用。
#5楼
在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__':
块,似乎没有什么区别。 这将不会使该模块可调用。
#6楼
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
#7楼
看来您已完成将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
:
>>> 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
#8楼
我想您已经通过设置全局变量“ module”来覆盖了内置函数/变量或其他“ module”。 只需打印模块,看看其中有什么。
#9楼
我知道这个线程已经使用了一年,但是真正的问题出在您的工作目录中。
我相信工作目录是C:\\Users\\Administrator\\Documents\\Mibot\\oops\\
。 请在此目录中检查名为socket.py
的文件。 找到它后,对其进行重命名或移动。 当你输入插座, socket.py
从当前目录是用来代替socket.py
从Python的目录。 希望这会有所帮助。 :)
注意:切勿使用Python目录中的文件名来保存程序的文件名。 它将与您的程序冲突。