python - socket非阻塞 - socket.af_inet
TypeError:'模块'对象不可调用 (6)
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
:
>>> 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的内容是:
Class YourClass:
......
如果你使用:
from YourClassParentDir import YourClass # means YourClass.py
这样,我得到了TypeError:'模块'对象不可调用 。
但是,如果你使用:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
这个对我有用。
我猜你已经通过设置全局变量“module”重写了内建函数/变量或其他“模块”。 只需打印模块即可查看其中的内容。
我知道这个线程已经有一年了,但真正的问题在于你的工作目录。
我相信工作目录是C:\Users\Administrator\Documents\Mibot\oops\
。 请检查此目录中名为socket.py
的文件。 一旦找到它,重命名或移动它。 在导入套接字时,将使用当前目录中的socket.py
,而不是Python的目录中的socket.py
。 希望这有助于。 :)
注意:切勿使用Python目录中的文件名来保存程序的文件名; 它会与你的程序发生冲突。
看起来你所做的是将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 *
:
>>> 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
解决这个问题的一个简单方法是导出PYTHONPATH
变量环境。 例如,对于Debian / GNU Linux中的Python 2.6:
export PYTHONPATH=/usr/lib/python2.6`
在其他操作系统中,您首先会找到该模块或socket.py
文件的位置。