Python 类型错误:';模块';对象不可调用
为什么我会犯这个错误? 我很困惑Python 类型错误:';模块';对象不可调用,python,sockets,Python,Sockets,为什么我会犯这个错误? 我很困惑 回答我的问题需要知道什么?socket是一个模块,包含类socket 您需要从套接字导入套接字执行socket.socket(…)或: 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 c
回答我的问题需要知道什么?
socket
是一个模块,包含类socket
您需要从套接字导入套接字执行socket.socket(…)
或:
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
导入套接字
>>>插座
>>>插座
>>>
>>>从套接字导入套接字
>>>插座
这就是错误消息的含义:它说,
模块对象不可调用
,因为您的代码正在调用模块对象。模块对象是导入模块时得到的对象类型。您试图做的是在模块对象中调用一个类对象,该类对象恰好与包含它的模块同名
下面是一种逻辑分解此类错误的方法:
- “
。Python告诉我,我的代码试图调用无法调用的东西。我的代码试图调用什么?”模块对象不可调用
- “代码正在尝试调用
。这应该是可调用的!变量socket
是我认为的吗?”`socket
- 我应该打印出套接字是什么,然后检查
print socket
socket
模块导入为import socket
。因此socket
就是模块。您需要将该行更改为self.serv=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
,以及每隔一次使用套接字
模块,或将导入语句从套接字导入套接字更改为
或者,在套接字导入的之后有一个导入套接字
:
>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>
来自套接字导入的>>*
>>>serv=套接字(自动网络、套接字流)
>>>导入套接字
>>>serv=套接字(自动网络、套接字流)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“模块”对象不可调用
我知道这个线程已经有一年了,但真正的问题是在您的工作目录中
我相信工作目录是C:\Users\Administrator\Documents\Mibot\oops\
。请检查此目录中名为socket.py
的文件。找到它后,重命名或移动它。导入socket时,将使用当前目录中的socket.py
,而不是Python di中的socket.py
教区长。希望这有帮助。:)
注意:切勿使用Python目录中的文件名保存程序的文件名;这会与程序冲突。解决此问题的简单方法是导出PYTHONPATH
变量环境。例如,对于Debian/GNU Linux中的Python 2.6:
>>> 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.py
文件的位置。这是另一个问题,即使在阅读了这些文章之后,我也花了一段时间才看到。我正在设置一个脚本来调用python bin脚本。我也无法调用该模块
我的想法是我在做以下事情:
export PYTHONPATH=/usr/lib/python2.6`
当我的zag需要执行以下操作时:
from mypackage.bin import myscript
...
myscript(...)
总之,请仔细检查包和模块嵌套
我试图做的是创建一个没有*.py扩展名的脚本目录,并且在mypackage/bin中仍然有“bin”模块,这些模块有我的*.py扩展名。我是打包新手,尝试在解释这些标准时遵循这些标准。因此,我在安装根目录中:
from mypackage.bin.myscript import myscript
...
myscript(...)
如果这不符合标准,请告诉我。添加到您的ClassParentDir中的主\uu init\uuuuuuuuuuy.py
,例如:
setup.py
scripts/
script1
mypackage/
bin/
script1.py
subpackage1/
subpackage_etc/
然后,当您将类的实例导入到另一个脚本中时,它将准备就绪:
from .YourClass import YourClass
假设YourClass.py的内容是:
from YourClassParentDir import YourClass
如果您使用:
class YourClass:
# ......
from YourClassParentDir import YourClass # means YourClass.py
这样,如果您尝试调用YourClass()
,您将得到TypeError:“module”对象不可调用
但是,如果您使用:
class YourClass:
# ......
from YourClassParentDir import YourClass # means YourClass.py
或者使用YourClass.YourClass()
,它可以工作。在setup.py中配置控制台脚本入口点时,当端点是模块或包而不是模块中的函数时,我发现存在此问题
from YourClassParentDir.YourClass import YourClass # means Class YourClass
应该是
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule]
},
# ...
)
因此,它将引用一个可调用的函数而不是模块本身。如果模块有一个if uuu name uuu=='\uuu main uu':
块,这似乎没有什么区别。这将不会使模块可调用。我猜您已经通过设置全局变量“module”覆盖了内置函数/变量或其他“module”“。只需打印模块,查看其中的内容。检查导入语句,因为模块不可调用。
在Python中,所有东西(包括函数、方法、模块、类等)都是对象。简短回答:您将文件/目录作为函数而不是实际函数调用。
请继续阅读:
当您将模块作为函数导入并调用它时,就会发生这种错误。
因此,python模块中有一个.py文件。包(目录)也可以视为模块。
假设我有一个create.py文件。在该文件中,我有一个如下函数:
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule:main]
},
# ...
)
#inside create.py
def create():
pass
现在,在另一个代码文件中,如果我这样做:
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule:main]
},
# ...
)
#inside create.py
def create():
pass
当我将create.py文件作为函数调用时,会出现此错误。
所以我必须这样做:
#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here
希望有帮助!快乐编码 我也面临同样的问题。然后我试着不使用
从YourClass导入YourClass
我刚刚复制了YourClass.py的全部代码,并在主代码(或当前代码)上运行它。它解决了错误我已将套接字导入为:从套接字导入*我可以更改它,但这需要一段时间,所以我不愿意。@user您可能稍后在某个地方得到了一个导入套接字
,它将导入模块socket
,覆盖类socket
。请参见编辑中的代码段。@用户:您应该