首页 文章

TypeError:'module' object不可调用

提问于
浏览
395
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

为什么我收到此错误?我糊涂了 .

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

9 回答

  • 91

    在setup.py中配置console_scripts入口点时,我发现当 endpoints 是模块或包而不是模块中的函数时,存在此问题 .

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

  • 79

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

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

    Note: 切勿使用Python 's directory to save your program'文件名中的文件名;它会与你的程序冲突 .

  • 7

    假设 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() ,它适合我 .

  • 0

    这是另一个问题,即使在阅读这些帖子后,我也花了一些时间才看到 . 我正在设置一个脚本来调用我的python bin脚本 . 我让模块也无法调用 .

    我的zig是我做了以下事情:

    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/
    

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

  • 25

    我猜你已经通过设置全局变量“module”覆盖了内置函数/变量或其他“模块” . 只需打印模块,查看其中的内容 .

  • 0

    看起来你所做的就是将 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 *
    >>> 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
    
  • 0

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

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

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

  • 423

    添加到 __init__.py ,例如:

    from YourClass import YourClass
    

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

    from YourClassParentDir import YourClass
    
  • 19

    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 ,您可能正在调用模块对象! 's a module object? It'是您导入模块时获得的类型 .

    但是,即使你不理解(这很好,它常常令人困惑的是类,模块,函数等都只是像其他一样的对象),有一个非常简单的方法来开始调试:

    • “嗯, module object is not callable . 这听起来像我打电话 . 我想知道我打算打电话给谁?”

    • “哦,我正在调用 socket . 这应该是可调用的!我想知道变量 socket 是否是我认为的?”

    • print socket

相关问题