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

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

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


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

В настоящее время я импортирую сокет, как это: из импорта сокетов *
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/

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


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

Я импортировал сокет как: из импорта сокетов * Я могу изменить его, но это займет некоторое время, поэтому я не хочу.
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 для сохранения имени файла вашей программы; это будет конфликтовать с вашей программой (программами).


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

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


0

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


-1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.