ChatGPT解决这个技术问题 Extra ChatGPT

TypeError:“模块”对象不可调用

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

为什么我会收到此错误?我很困惑。

你需要知道什么来回答我的问题?

我曾经遇到过这个错误,因为我有一个(全局)变量和一个同名的函数。
我收到此错误,文件名指向我以前工作过的 ipynb 文件所在的同一文件夹中的 random.py。我将文件名更改为 random_function.py 并重新启动了 jupyter notebook。错误消失了。为了测试名称 random.py 是否有问题,我将文件 random_function.py 改回 random.py。问题又来了。不要以 python 库的名称命名你的文件。

R
Rob

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 告诉我我的代码试图调用无法调用的东西。我的代码试图调用什么?”

“代码正在尝试调用套接字。那应该是可调用的!变量套接字是我认为的吗?

我应该打印出套接字是什么并检查打印套接字


我也将它更改为 from socket import socket ,但我仍然遇到同样的错误。
哦,我明白了。 socket.socket 有点令人困惑。我只是做了 import write_to_file 然后,因为我在 write_to_file.py 中使用的方法被命名为 writeToTextFile 我只是简单地 rand write_to_file.writeToTextFile
值得注意的是,这对于至少 133 名不理解这一点的花时间投票的人(包括我自己)来说并不明显。现在,很明显,下次我打开工具箱时,当模块被报告为“不可调用”时,我会找到这个工具。开始使用新语言是最困难的部分。
@maudulus 我发现 Python 在这些方面不是很友好。
到底为什么有人想要拥有一个模块本身的“句柄”(它只是一个源代码文件),而不是首先在其中定义的类?那有什么用例?
B
Bowen Xu

假设 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(),它可以工作。


类 = YourClass.YourClass()
我通过使用 from yourClass import * 解决了这个问题
最佳答案,我需要更多地研究 python 中的命名空间导入
R
Robert

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

from .YourClass import YourClass

然后,当您将其导入另一个脚本时,您将准备好您的类的实例:

from YourClassParentDir import YourClass

它不应该是 __init__.py 文件中的 from .YourClass import YourClass 吗?
A
Asclepius

简短的回答:您将文件/目录作为函数而不是真正的函数来调用

继续阅读:

当您导入模块并将其视为函数并调用它时,会发生这种错误。所以在 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.

z
zerocog

这是另一个问题,即使在阅读了这些帖子之后,我也花了一段时间才看到。我正在设置一个脚本来调用我的 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/

如果这不符合标准,请告诉我。


m
moinudin

您所做的似乎是将 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

我已经将socket导入为:from socket import * 可以改,不过需要一段时间,所以不太情愿。
@user 您可能稍后在某个地方得到了一个 import socket,它将导入覆盖类 socket 的模块 socket。请参阅编辑中的代码片段。
@user:你应该改变它。 from <...> import * 导入 bad, bad, bad 的原因或多或少是这样的:通常您确切地知道全局命名空间中的内容,因为它正是您放在那里的内容。但是当您 import * 时,您会用其他模块定义的各种内容填充该名称空间。在这种情况下,不清楚名称 socket 的来源——它是模块还是该模块中定义的东西?如果您总是使用 import socketfrom socket import socket,您将永远不会遇到这个问题,因为您可以准确地看到正在使用的名称。
好的。谢谢你的提示。我刚刚从很多教程中养成了习惯。
f
fragilewindows

我知道这个线程已经有一年了,但真正的问题出在你的工作目录中。

我相信工作目录是 C:\Users\Administrator\Documents\Mibot\oops\。请检查此目录中名为 socket.py 的文件。找到它后,重命名或移动它。导入套接字时,使用当前目录中的 socket.py 而不是 Python 目录中的 socket.py。希望这有帮助。 :)

注意:切勿使用 Python 目录中的文件名来保存程序的文件名;它会与您的程序冲突。


这绝对值得注意。我只是想快速检查一下套接字,所以我简单地将文件命名为 socket.py。好吧,这导致了完全相同的错误消息。这个页面让我走上了正轨:python-notes.curiousefficiency.org/en/latest/python_concepts/…
L
Luke Exton

在 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
N
Nazmus Sakib Akash

我遇到了同样的问题。然后我尝试不使用 from YourClass import YourClass

我只是复制了YourClass.py的整个代码并在主代码(或当前代码)上运行它。它解决了错误


u
umairhhhs

我猜你已经通过设置全局变量“模块”覆盖了内置函数/变量或其他“模块”。只需打印模块,看看里面有什么。


S
Stuart Moore

这是我偶然发现并困惑了一段时间的可能的额外边缘案例,希望它对某人有所帮助:

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


f
fragilewindows

解决此问题的一种简单方法是导出PYTHONPATH变量环境。例如,对于 Debian/GNU Linux 中的 Python 2.6:

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

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


A
Ayesha Siddiqa

检查导入语句,因为模块不可调用。在 Python 中,一切(包括函数、方法、模块、类等)都是对象。