【问题标题】:TypeError: 'module' object is not callableTypeError:“模块”对象不可调用
【发布时间】:2011-05-30 21:14:02
【问题描述】:
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 库的名称命名你的文件。

标签: python sockets


【解决方案1】:

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 对象,该对象恰好与包含它的模块具有相同的名称。

这是一种逻辑分解此类错误的方法:

  • module object is not callable。Python 告诉我我的代码试图调用无法调用的东西。我的代码试图调用什么?”
  • “代码正在尝试调用socket。这应该是可调用的!变量socket是我认为的吗?`
  • 我应该打印出什么是套接字并检查print socket

【讨论】:

  • 我目前正在像这样导入套接字:from socket import *
  • 我也将它更改为 from socket import socket,但我仍然遇到同样的错误。
  • 哦,我明白了。 socket.socket 有点令人困惑。我只是做了import write_to_file 然后,因为我在write_to_file.py 内部使用的方法被命名为writeToTextFile 我只是简单地和write_to_file.writeToTextFile
  • 值得注意的是,至少有 133 名不理解这一点的花时间投票的人(包括我自己)对此并不明显。现在,很明显,下次我打开工具箱时,当模块被报告为“不可调用”时,我会找到这个工具。开始使用新语言是最困难的部分。
  • @maudulus 我觉得 Python 在这些方面不是很友好。
【解决方案2】:

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

【讨论】:

  • class= YourClass.YourClass()
  • 我通过使用 from yourClass import * 解决了这个问题
  • 最佳答案,我需要更多地研究 python 中的命名空间导入
  • 这就是答案
【解决方案3】:

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

from .YourClass import YourClass

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

from YourClassParentDir import YourClass

【讨论】:

  • 不应该是__init__.py文件中的from .YourClass import YourClass吗?
【解决方案4】:

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

继续阅读:

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

希望对您有所帮助!快乐编码!

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      您所做的似乎是将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。请参阅编辑中的代码 sn-p。
      • @user:你应该改变它。 from &lt;...&gt; import * 导入的原因 bad, bad, bad 或多或少是这样的:通常你知道全局命名空间中有什么,因为它正是你放在那里的。但是当您import * 时,您会用其他模块定义的各种东西填充该名称空间。在这种情况下,不清楚socket 的名称来自何处——它是模块还是该模块中定义的东西?如果您总是使用import socketfrom socket import socket,您将永远不会遇到这个问题,因为您可以准确地看到正在使用的名称。
      • 好的。谢谢你的提示。我刚刚从很多教程中养成了这个习惯。
      【解决方案7】:

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

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

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

      【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        在 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__': 块,似乎没有什么区别。这不会使模块可调用。

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

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

            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

            【讨论】:

              【解决方案12】:

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

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

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

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  猜你喜欢
                  • 2017-06-17
                  • 2014-09-21
                  • 2021-11-22
                  • 2017-05-08
                  • 1970-01-01
                  • 2021-12-24
                  相关资源
                  最近更新 更多