TypeError: 'module' object is not callable

2019-01-01 09:55发布

问题:

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

Why am I getting this error? I\'m confused.

What do you need to know to answer my question?

回答1:

socket is a module, containing the class socket.

You need to do socket.socket(...) or 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\'>

Notice that the error here is pretty easy to understand: if module object is not callable, you are probably calling a module object! What\'s a module object? It\'s the type of thing you get when you import a module.

But even if you don\'t understand that (which is fine, it\'s often confusing that classes, modules, functions etc are all just objects like everything else), there\'s a pretty easy way to start debugging:

  • \"Hmm, module object is not callable. That sounds like I\'m trying to call something that you can\'t call. I wonder what I\'m trying to call?\"
  • \"Oh, I\'m calling socket. That should be callable! I wonder if the variable socket is what I think it is?`
  • print socket


回答2:

Assume that the content of YourClass.py is:

class YourClass:
    # ......

If you use:

from YourClassParentDir import YourClass  # means YourClass.py

In this way, I got TypeError: \'module\' object is not callable if you then tried to use YourClass().

But, if you use:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

or use YourClass.YourClass(), it works for me.



回答3:

Add to __init__.py, e.g.:

from YourClass import YourClass

Then, you will have an instance of your class ready when you import it into another script:

from YourClassParentDir import YourClass


回答4:

Here is another gotcha, that took me awhile to see even after reading these posts. I was setting up a script to call my python bin scripts. I was getting the module not callable too.

My zig was that I was doing the following:

from mypackage.bin import myscript
...
myscript(...)

when my zag needed to do the following:

from mypackage.bin.myscript import myscript
...
myscript(...)

In summary, double check your package and module nesting.

What I am trying to do is have a scripts directory that does not have the *.py extension, and still have the \'bin\' modules to be in mypackage/bin and these have my *.py extension. I am new to packaging, and trying to follow the standards as I am interpreting them. So, I have at the setup root:

setup.py
scripts/
      script1
mypackage/
   bin/
      script1.py
   subpackage1/
   subpackage_etc/

If this is not compliant with standard, please let me know.



回答5:

It seems like what you\'ve done is imported the socket module as import socket. Therefore socket is the module. You either need to change that line to self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), as well as every other use of the socket module, or change the import statement to from socket import socket.

Or you\'ve got an import socket after your 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


回答6:

I know this thread is a year old, but the real problem is in your working directory.

I believe that the working directory is C:\\Users\\Administrator\\Documents\\Mibot\\oops\\. Please check for the file named socket.py in this directory. Once you find it, rename or move it. When you import socket, socket.py from the current directory is used instead of the socket.py from Python\'s directory. Hope this helped. :)

Note: Never use the file names from Python\'s directory to save your program\'s file name; it will conflict with your program(s).



回答7:

A simple way to solve this problem is export thePYTHONPATH variable enviroment. For example, for Python 2.6 in Debian/GNU Linux:

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

In other operating systems, you would first find the location of this module or the socket.py file.



回答8:

When configuring an console_scripts entrypoint in setup.py I found this issue existed when the endpoint was a module or package rather than a function within the module.

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

For example

from setuptools import setup
setup (
# ...
    entry_points = {
        \'console_scripts\': [mycli=package.module.submodule]
    },
# ...
)

Should have been

from setuptools import setup
setup (
# ...
    entry_points = {
        \'console_scripts\': [mycli=package.module.submodule:main]
    },
# ...
)

So that it would refer to a callable function rather than the module itself. It seems to make no difference if the module has a if __name__ == \'__main__\': block. This will not make the module callable.



回答9:

I guess you have overridden the builtin function/variable or something else \"module\" by setting the global variable \"module\". just print the module see whats in it.