TypeError: объект 'module' не вызывается

544
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

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

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

user551717
источник
8
Однажды я получил эту ошибку, потому что у меня была (глобальная) переменная и функция с тем же именем.
remustata

Ответы:

563

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. Python говорит мне, что мой код пытается вызвать то, что не может быть вызвано. Что мой код пытается вызвать?"
  • «Код пытается вызвать socket. Это должно вызываться! Является ли переменная socketтем, чем я думаю?»
  • Я должен распечатать, что такое сокет и проверить print socket
Katriel
источник
В настоящее время я импортирую сокет, как это: из импорта сокетов *
user551717
Я также изменил его с сокета импорта сокета, и я все еще получаю ту же ошибку.
user551717
@user: если вы это сделаете, print socketвы увидите, что имя socketявляется модулем. Он должен быть связан с этим модулем где - то ! Внимательно прочитайте свой код, и я уверен, что вы увидите import socketили что-то подобное там, где вы этого не ожидаете.
Катриэль
2
О, я понял. Это socket.socketбыло немного запутанным. Я просто сделал, import write_to_fileа затем, так как метод, который я использовал внутри, write_to_file.pyназван, writeToTextFileя просто рандwrite_to_file.writeToTextFile
maudulus
9
Стоит отметить, что это не было очевидно по крайней мере для 133 человек, которые нашли время, чтобы проголосовать (включая меня), которые не понимали этого. Теперь это очевидно, и в следующий раз, когда я зайду в свою панель инструментов, я найду этот инструмент, когда модуль будет объявлен «не вызываемым». Начало работы с новым языком является самой сложной частью.
jmort253
169

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

class YourClass:
    # ......

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

from YourClassParentDir import YourClass  # means YourClass.py

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

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

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

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

штифтик
источник
2
class = YourClass.YourClass ()
КунМин Се
2
Я решил эту проблему с помощью импорта из вашего класса *
Кит
104

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

from .YourClass import YourClass

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

from YourClassParentDir import YourClass
Хосе Албан
источник
5
Разве это не должно быть from .YourClass import YourClass в __init__.pyфайле?
Николас Сейллер
28

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

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

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

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

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

Таким образом, дважды проверьте ваш пакет и вложенность модуля.

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

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

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

zerocog
источник
22

Кажется, что вы сделали, импортировал 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
moinudin
источник
Я импортировал сокет как: из импорта сокетов * Я могу изменить его, но это займет некоторое время, поэтому я не хочу.
user551717
@user Вы, вероятно, позже где-то получили import socket, который будет импортировать модуль, socketпереопределяющий класс socket. Смотрите фрагмент кода в редактировании.
Мойнудин
3
@user: вы должны изменить это. Причины from <...> import *импорта плохие, плохие, плохие более или менее таковы : обычно вы точно знаете, что находится в глобальном пространстве имен, потому что это именно то, что вы поместили туда. Но когда вы import *, вы заполняете это пространство имен всем, что определяют другие модули. В этом случае неясно, откуда socketпоявилось имя - это модуль или что-то определенное в этом модуле? Если вы всегда используете import socketили from socket import socket, у вас никогда не возникнет этой проблемы, поскольку вы можете точно знать, какие имена используются.
Катриэль
Ладно. Спасибо за совет. Я только что привык к многим урокам.
user551717
7

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

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

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

Blackwind
источник
1
Это определенно стоит отметить. Я просто пытался быстро проверить с помощью сокетов, поэтому я просто назвал файл socket.py. Ну, это было причиной того же сообщения об ошибке. Эта страница поставила меня на правильный путь: python-notes.curiousefficiency.org/en/latest/python_concepts/…
Czechchnology
0

При настройке точки входа 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

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

umairhhhs
источник
0

проверьте операторы импорта, так как модуль не вызывается. В Python все (включая функции, методы, модули, классы и т. Д.) Является объектом.

Айша Сиддика
источник
-1

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

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

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

Оскар Ардила
источник