TypeError:'module'对象不可调用

use*_*717 491 python sockets

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
Run Code Online (Sandbox Code Playgroud)

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

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

Kat*_*iel 512

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'>
Run Code Online (Sandbox Code Playgroud)

请注意,这里的错误很容易理解:如果module object is not callable,您可能正在调用模块对象!什么是模块对象?这是导入模块时获得的类型.

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

  • "嗯,module object is not callable这听起来像是在试着打电话给你打不开的东西.我想知道我打算打电话给谁?"
  • "哦,我正在打电话socket.那应该是可以调用的!我想知道变量socket是否是我认为的变量?"
  • print socket

  • 值得注意的是,至少有133人花时间进行投票(包括我自己)并不理解这一点,这一点并不明显.现在,很明显,下次我到达工具箱时,我会在模块被报告为"不可调用"时找到此工具.开始使用新语言是最棘手的部分. (8认同)
  • @maudulus 我不认为 Python 在这些方面非常用户友好。 (4认同)
  • @Milimetric`reload(module)` (3认同)
  • 哦,我明白了.`socket.socket`有点令人困惑.我只是执行`import write_to_file`然后,因为我在`write_to_file.py`中使用的方法被命名为`writeToTextFile`,我只是简单地写了`write_to_file.writeToTextFile` (2认同)
  • 为什么有人首先想要拥有模块本身(这只是一个源代码文件)的“句柄”,而不是其中定义的类?其用途是什么? (2认同)

Bra*_*rad 147

假设YourClass.py的内容是:

class YourClass:
    # ......
Run Code Online (Sandbox Code Playgroud)

如果您使用:

from YourClassParentDir import YourClass  # means YourClass.py
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我得到了TypeError:如果你试图使用,那么'module'对象是不可调用的YourClass().

但是,如果您使用:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass
Run Code Online (Sandbox Code Playgroud)

或使用YourClass.YourClass(),它适合我.

  • 我通过使用 from yourClass import * 解决了这个问题 (3认同)
  • class = YourClass.YourClass() (2认同)

Jos*_*ban 98

添加到__init__.pyYourClassParentDir中的main ,例如:

from .YourClass import YourClass
Run Code Online (Sandbox Code Playgroud)

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

from YourClassParentDir import YourClass
Run Code Online (Sandbox Code Playgroud)

  • 不应该是`from.YourClass在`__init __.py`文件中导入YourClass`吗? (5认同)

Dee*_*and 29

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

继续阅读:

当您将模块视为函数并调用它时,会发生这种错误。所以在 python 模块中是一个 .py 文件。包(目录)也可以被视为模块。假设我有一个create.py文件。在那个文件中,我有一个这样的功能:

#inside create.py
def create():
  pass
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,在另一个代码文件中:

#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here
Run Code Online (Sandbox Code Playgroud)

它在将 create.py 文件作为函数调用时出现此错误。所以我必须这样做:

from create import create
create() #now it works.
Run Code Online (Sandbox Code Playgroud)

希望有帮助!快乐编码!


zer*_*cog 27

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

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

from mypackage.bin import myscript
...
myscript(...)
Run Code Online (Sandbox Code Playgroud)

当我的zag需要执行以下操作时:

from mypackage.bin.myscript import myscript
...
myscript(...)
Run Code Online (Sandbox Code Playgroud)

总之,仔细检查您的包和模块嵌套.

我想要做的是有一个脚本目录,它没有*.py扩展名,并且仍然有'bin'模块在mypackage/bin中,并且这些模块的扩展名为*.py.我是新来的包装,并且在我解释它们时试图遵循标准.所以,我在设置根目录:

setup.py
scripts/
      script1
mypackage/
   bin/
      script1.py
   subpackage1/
   subpackage_etc/
Run Code Online (Sandbox Code Playgroud)

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


mar*_*cog 21

看起来你所做的就是导入socket模块了import socket.因此socket是模块.您需要将该行更改self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)socket模块的每个其他用途,或者将import语句更改为from socket import socket.

或者你有一个import socket跟随你的from socket import *:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @user:你应该改变它.`from <...> import*`导入的原因是__bad,bad,bad__或多或少是这样的:通常你确切知道全局命名空间中的内容,因为它正是你放在那里的东西.但是当你`import*`时,你用其他模块定义的各种东西填充该命名空间.在这种情况下,不清楚`socket`的名称来自何处 - 是模块还是该模块中定义的东西?如果你_always_使用`import socket`或`from socket import socket`,你将永远不会遇到这个问题,因为你可以确切地看到正在使用的名称. (2认同)

小智 7

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

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

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