TypeError: объект 'module' не может быть вызван

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

Почему я получаю эту ошибку? Я в замешательстве.

Что вам нужно знать, чтобы ответить на мой вопрос?

Ответ 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'>

Обратите внимание, что здесь ошибка довольно проста: if module object is not callable, вы, вероятно, называете объект модуля! Что такое объект модуля? Это тот тип вещей, который вы получаете при импорте модуля.

Но даже если вы этого не понимаете (это нормально, это часто путает, что классы, модули, функции и т.д. - это все объекты, подобные всем остальным), там довольно простой способ начать отладку:

  • "Хм, module object is not callable. Похоже, я пытаюсь назвать то, что вы не можете назвать. Интересно, что я пытаюсь назвать?"
  • "О, я звоню socket. Это должно быть вызываемым! Интересно, является ли переменная socket тем, что я думаю?`
  • print socket

Ответ 2

Добавить в __init__.py, например:

from YourClass import YourClass

Затем у вас будет экземпляр вашего класса, готовый, когда вы импортируете его в другой script:

from YourClassParentDir import YourClass

Ответ 3

Предположим, что содержание YourClass.py:

Class YourClass:
......

Если вы используете:

from YourClassParentDir import YourClass  # means YourClass.py

Таким образом, я получил объект TypeError: 'module' не вызываемый.

Но если вы используете:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

Это работает для меня.

Ответ 4

Вот еще один вопрос, который заставил меня некоторое время видеть даже после прочтения этих сообщений. Я настраивал script для вызова моих сценариев bin python. Я тоже получал модуль, который нельзя вызывать.

Мой zig был тем, что я делал следующее:

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

когда мне нужно было сделать следующее:

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

Вкратце, дважды проверьте свой пакет и вложенность модуля.

То, что я пытаюсь сделать, это иметь каталог скриптов, у которого нет расширения *.py, и все еще есть модули "bin" в mypackage/bin, и у них есть расширение *.py. Я новичок в упаковке и стараюсь следовать стандартам, поскольку я их интерпретирую. Итак, у меня есть корень установки:

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

Если это не соответствует стандарту, сообщите мне.

Ответ 5

Похоже, что вы сделали импортированный модуль socket как import socket. Поэтому socket является модулем. Вам необходимо изменить эту строку на self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), а также на любое другое использование модуля socket или изменить оператор импорта на 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

Ответ 6

Я знаю, что эта тема - год, но реальная проблема в вашем рабочем каталоге.

Я считаю, что рабочий каталог C:\Users\Administrator\Documents\Mibot\oops\. Проверьте файл с именем socket.py в этом каталоге. Как только вы его найдете, переименуйте или переместите. При импорте сокета вместо socket.py из каталога Python используется socket.py из текущего каталога. Надеюсь, это помогло.:)

Примечание. Никогда не используйте имена файлов из каталога Python для сохранения имени файла вашей программы; он будет конфликтовать с вашей программой.

Ответ 7

Простым способом решения этой проблемы является экспорт переменной среды PYTHONPATH. Например, для Python 2.6 в Debian/GNU Linux:

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

В других операционных системах вы сначала найдете местоположение этого модуля или файла socket.py.

Ответ 8

При настройке точки входа console_scripts в setup.py я обнаружил, что эта проблема существует, когда конечная точка является модулем или пакетом, а не функцией внутри модуля.

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__':. Это не сделает модуль доступным.