TypeError: o objeto 'module' não pode ser chamado

543
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

Por que estou recebendo esse erro? Estou confuso.

O que você precisa saber para responder à minha pergunta?

user551717
fonte
8
Certa vez, recebi esse erro porque tinha uma variável (global) e uma função com o mesmo nome.
Remustata

Respostas:

563

socketé um módulo, que contém a classe socket.

Você precisa fazer socket.socket(...)ou 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'>

É isso que a mensagem de erro significa:
Diz module object is not callable, porque seu código está chamando um objeto de módulo . Um objeto de módulo é o tipo de coisa que você obtém ao importar um módulo. O que você estava tentando fazer é chamar um objeto de classe dentro do objeto do módulo que tenha o mesmo nome que o módulo que o contém.

Aqui está uma maneira de quebrar logicamente esse tipo de erro:

  • " module object is not callable. Python está me dizendo meu código tentando chamar algo que não pode ser chamado. Qual é o meu código tentando chamar?"
  • "O código está tentando chamar socket. Isso deve ser exigível! A variável socketé o que eu acho que é?`
  • Devo imprimir o que é soquete e verificar print socket
Katriel
fonte
Atualmente, estou imporitng soquete assim: from socket import *
user551717
Também mudei para socket socket import e ainda estou recebendo o mesmo erro.
user551717
@user: se você fizer print socketisso, verá que o nome socketé um módulo. Ele deve ter sido vinculado a esse módulo em algum lugar ! Leia o seu código com atenção e tenho certeza de que você verá um import socketou outro local onde não o espera.
Katriel
2
Ohh, entendi. O socket.socketfoi um pouco confuso. Eu simplesmente fiz import write_to_filee depois, uma vez que o método que eu estava usando dentro write_to_file.pyé chamado writeToTextFilesimplesmente randwrite_to_file.writeToTextFile
maudulus
9
Vale a pena notar que isso não era óbvio para pelo menos 133 pessoas que levaram tempo para votar (inclusive eu) que não entenderam isso. Agora, é óbvio, e da próxima vez que chegar na minha caixa de ferramentas, encontrarei essa ferramenta quando um módulo for reportado como "não aceitável". Começar com um novo idioma é a parte mais difícil.
precisa saber é o seguinte
168

Suponha que o conteúdo de YourClass.py seja:

class YourClass:
    # ......

Se você usar:

from YourClassParentDir import YourClass  # means YourClass.py

Dessa forma, obtive o TypeError: o objeto 'module' não pode ser chamado se você tentar usar YourClass().

Mas se você usar:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

ou usar YourClass.YourClass(), funciona para mim.

Brad
fonte
2
class = YourClass.YourClass ()
KunMing Xie 30/10
2
Resolvi esse problema usando a partir da importação de yourClass *
Keith
104

Adicione ao main __init__.pyem YourClassParentDir, por exemplo:

from .YourClass import YourClass

Em seguida, você terá uma instância da sua classe pronta ao importá-la para outro script:

from YourClassParentDir import YourClass
Jose Alban
fonte
5
Não deveria estar from .YourClass import YourClass no __init__.pyarquivo?
Nicolas Seiller #
28

Aqui está outra pegadinha, que me levou um tempo para ver, mesmo depois de ler essas postagens. Eu estava configurando um script para chamar meus scripts python bin. Eu estava recebendo o módulo também não utilizável.

Meu zig era que eu estava fazendo o seguinte:

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

quando meu zag precisava fazer o seguinte:

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

Em resumo, verifique novamente o aninhamento de pacotes e módulos.

O que estou tentando fazer é ter um diretório de scripts que não possua a extensão * .py e ainda tenha os módulos 'bin' em mypackage / bin e estes tenham a minha extensão * .py. Eu sou novo em embalagens e estou tentando seguir os padrões enquanto os interpreto. Então, eu tenho na raiz da instalação:

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

Se isso não estiver em conformidade com o padrão, informe-me.

zerocog
fonte
22

Parece que o que você fez foi importado socketcomo o módulo import socket. Portanto, socketé o módulo. Você precisa alterar essa linha para self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), assim como qualquer outro uso do socketmódulo, ou alterar a instrução de importação para from socket import socket.

Ou você tem um import socketapós o seu 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
fonte
Importei o soquete como: from socket import * Eu posso alterá-lo, mas vai demorar um pouco, por isso estou relutante em.
User551717
@user Você provavelmente mais tarde obteve um import socket, que importará o módulo que socketsubstitui a classe socket. Veja o snippet de código na edição.
moinudin
3
@ usuário: você deve alterá-lo. A razão pela qual as from <...> import *importações são ruins, ruins, ruins é mais ou menos isso: normalmente você sabe exatamente o que está no espaço para nome global, porque é exatamente o que você colocou lá. Mas quando você import *preenche esse espaço para nome com todo tipo de coisa que outros módulos definem. Nesse caso, não está claro de onde socketveio o nome - é o módulo ou algo definido nesse módulo? Se você sempre usa import socketou from socket import socket, nunca terá esse problema, pois pode ver exatamente quais nomes estão em uso.
Katriel
OK. Obrigado pela dica. Acabei de adquirir o hábito de muitos tutoriais.
user551717
7

Eu sei que este segmento tem um ano, mas o verdadeiro problema está no seu diretório de trabalho.

Eu acredito que o diretório de trabalho é C:\Users\Administrator\Documents\Mibot\oops\. Por favor, verifique o arquivo nomeado socket.pyneste diretório. Depois de encontrá-lo, renomeie ou mova-o. Quando você importa o soquete, socket.pyo diretório atual é usado em vez socket.pydo diretório do Python. Espero que isso tenha ajudado. :)

Nota: Nunca use os nomes de arquivo do diretório Python para salvar o nome do arquivo do seu programa; entrará em conflito com o (s) seu (s) programa (s).

vento Negro
fonte
1
Definitivamente, vale a pena notar isso. Eu estava apenas tentando uma verificação rápida com soquetes, então simplesmente nomeei o arquivo socket.py. Bem, isso estava causando exatamente a mesma mensagem de erro. Esta página me colocou no caminho certo: python-notes.curiousefficiency.org/en/latest/python_concepts/…
Czechnology
0

Ao configurar um ponto de entrada console_scripts em setup.py, descobri que esse problema existia quando o nó de extremidade era um módulo ou pacote e não uma função dentro do módulo.

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

Por exemplo

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

Deveria ter ficado

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

Para que se referisse a uma função que pode ser chamada, e não ao próprio módulo. Parece não fazer diferença se o módulo tiver um if __name__ == '__main__':bloco. Isso não tornará o módulo passível de chamada.

Luke Exton
fonte
0

Eu acho que você substituiu a função / variável interna ou algo mais "module" configurando a variável global "module". basta imprimir o módulo e ver o que há nele.

umairhhhs
fonte
0

verifique as instruções de importação, pois um módulo não pode ser chamado. No Python, tudo (incluindo funções, métodos, módulos, classes etc.) é um objeto.

Ayesha Siddiqa
fonte
-1

Uma maneira simples de resolver esse problema é exportar o PYTHONPATHambiente variável. Por exemplo, para Python 2.6 no Debian / GNU Linux:

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

Em outros sistemas operacionais, você primeiro encontraria o local deste módulo ou do socket.pyarquivo.

Oscar Ardila
fonte