TypeError: объект 'module' не вызывается - PullRequest
448 голосов
/ 26 декабря 2010
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 ]

470 голосов
/ 26 декабря 2010

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 object is not callable. Звучит так, как будто я пытаюсь вызвать то, что вы не можете назвать.пытаюсь позвонить? "
  • " О, я звоню socket. Это должно быть вызвано! Интересно, если переменная socket - это то, что я думаю? `
  • print socket
117 голосов
/ 22 февраля 2017

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

class YourClass:
    # ......

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

from YourClassParentDir import YourClass  # means YourClass.py

Таким образом, я получил TypeError: объект 'module' не вызывается , если вы тогда пытались использовать YourClass().

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

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

или используйте YourClass.YourClass(), у меня это работает.

90 голосов
/ 14 ноября 2014

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

from .YourClass import YourClass

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

from YourClassParentDir import YourClass
25 голосов
/ 10 января 2013

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

Мой зиг был в том, что я делал следующее:

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

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

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

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

Я пытаюсь создать каталог сценариев, который не имеет расширения * .py, и все еще имеет модули 'bin', которые должны быть в mypackage / bin, и они имеют мое расширение * .py. Я новичок в упаковке, и пытаюсь следовать стандартам, как я их интерпретирую. Итак, у меня в настройках root:

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

Если это не соответствует стандарту, пожалуйста, дайте мне знать.

21 голосов
/ 26 декабря 2010

Кажется, что то, что вы сделали, импортировало модуль 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
7 голосов
/ 13 января 2012

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

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

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

0 голосов
/ 31 марта 2018

Полагаю, вы переопределили встроенную функцию / переменную или что-то еще «модуль», установив глобальную переменную «модуль». просто распечатайте модуль и посмотрите, что в нем.

0 голосов
/ 22 июня 2017

При настройке точки входа 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__': блок. Это не сделает модуль вызываемым.

0 голосов
/ 30 декабря 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...