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 对象。模块对象是您在导入模块时获得的类型。您尝试做的是在模块对象中调用一个 class 对象,该对象恰好与包含它的模块具有相同的名称。
这是一种在逻辑上分解此类错误的方法:
“模块对象不可调用。Python 告诉我我的代码试图调用无法调用的东西。我的代码试图调用什么?”
“代码正在尝试调用套接字。那应该是可调用的!变量套接字是我认为的吗?
我应该打印出套接字是什么并检查打印套接字
假设 YourClass.py 的内容是:
class YourClass:
# ......
如果您使用:
from YourClassParentDir import YourClass # means YourClass.py
这样,如果您随后尝试调用 YourClass()
,您将收到 TypeError: 'module' object is not callable。
但是,如果您使用:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
或使用 YourClass.YourClass()
,它可以工作。
添加到 YourClassParentDir 中的主 __init__.py
,例如:
from .YourClass import YourClass
然后,当您将其导入另一个脚本时,您将准备好您的类的实例:
from YourClassParentDir import YourClass
__init__.py
文件中的 from .YourClass import YourClass
吗?
简短的回答:您将文件/目录作为函数而不是真正的函数来调用
继续阅读:
当您导入模块并将其视为函数并调用它时,会发生这种错误。所以在 python 模块中是一个 .py 文件。包(目录)也可以被视为模块。假设我有一个 create.py 文件。在那个文件中,我有一个这样的函数:
#inside create.py
def create():
pass
现在,如果我这样做,在另一个代码文件中:
#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here
它在将 create.py 文件作为函数调用时给出了这个错误。所以我必须这样做:
from create import create
create() #now it works.
这是另一个问题,即使在阅读了这些帖子之后,我也花了一段时间才看到。我正在设置一个脚本来调用我的 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/
如果这不符合标准,请告诉我。
您所做的似乎是将 socket
模块导入为 import socket
。因此 socket
是模块。您需要将该行更改为 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
,以及对 socket
模块的所有其他使用,或者将导入语句更改为 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
import socket
,它将导入覆盖类 socket
的模块 socket
。请参阅编辑中的代码片段。
from <...> import *
导入 bad, bad, bad 的原因或多或少是这样的:通常您确切地知道全局命名空间中的内容,因为它正是您放在那里的内容。但是当您 import *
时,您会用其他模块定义的各种内容填充该名称空间。在这种情况下,不清楚名称 socket
的来源——它是模块还是该模块中定义的东西?如果您总是使用 import socket
或 from socket import socket
,您将永远不会遇到这个问题,因为您可以准确地看到正在使用的名称。
我知道这个线程已经有一年了,但真正的问题出在你的工作目录中。
我相信工作目录是 C:\Users\Administrator\Documents\Mibot\oops\
。请检查此目录中名为 socket.py
的文件。找到它后,重命名或移动它。导入套接字时,使用当前目录中的 socket.py
而不是 Python 目录中的 socket.py
。希望这有帮助。 :)
注意:切勿使用 Python 目录中的文件名来保存程序的文件名;它会与您的程序冲突。
socket.py
。好吧,这导致了完全相同的错误消息。这个页面让我走上了正轨:python-notes.curiousefficiency.org/en/latest/python_concepts/…
在 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__':
块,似乎没有什么区别。这不会使模块可调用。
scripts
参数而不是 entry_points
我遇到了同样的问题。然后我尝试不使用 from YourClass import YourClass
我只是复制了YourClass.py的整个代码并在主代码(或当前代码)上运行它。它解决了错误
我猜你已经通过设置全局变量“模块”覆盖了内置函数/变量或其他“模块”。只需打印模块,看看里面有什么。
这是我偶然发现并困惑了一段时间的可能的额外边缘案例,希望它对某人有所帮助:
在 some_module/a.py
中:
def a():
pass
在 some_module/b.py
中:
from . import a
def b():
a()
在 some_module/__init__.py
中:
from .b import b
from .a import a
main.py
:
from some_module import b
b()
然后因为当 main.py 加载 b 时,它通过 __init__.py
尝试在 a.py
之前加载 b.py
。这意味着当 b.py
尝试加载 a
时,它会获取模块而不是函数 - 这意味着您将收到错误消息 module object is not callable
这里的解决方案是交换 some_module/__init__.py
中的顺序:
from .a import a
from .b import b
或者,如果这会创建循环依赖项,请将文件名更改为与函数不匹配,并直接从文件加载而不是依赖 __init__.py
解决此问题的一种简单方法是导出PYTHONPATH
变量环境。例如,对于 Debian/GNU Linux 中的 Python 2.6:
export PYTHONPATH=/usr/lib/python2.6`
在其他操作系统中,您将首先找到此模块或 socket.py
文件的位置。
检查导入语句,因为模块不可调用。在 Python 中,一切(包括函数、方法、模块、类等)都是对象。
socket.socket
有点令人困惑。我只是做了import write_to_file
然后,因为我在write_to_file.py
中使用的方法被命名为writeToTextFile
我只是简单地 randwrite_to_file.writeToTextFile