TypeError: l'oggetto 'module' non è richiamabile


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

Perché visualizzo questo errore? Non ho capito bene.

Cosa devi sapere per rispondere alla mia domanda?


8
Una volta ho avuto questo errore perché avevo sia una variabile (globale) che una funzione con lo stesso nome.
remustata,

Risposte:


563

socketè un modulo, contenente la classe socket.

Devi fare socket.socket(...)o 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'>

Questo è ciò che significa il messaggio di errore:
dice module object is not callable, perché il tuo codice chiama un oggetto modulo . Un oggetto modulo è il tipo di cosa che ottieni quando importi un modulo. Quello che stavi cercando di fare è chiamare un oggetto di classe all'interno dell'oggetto modulo che ha lo stesso nome del modulo che lo contiene.

Ecco un modo per suddividere logicamente questo tipo di errore:

  • " module object is not callable. Python mi sta dicendo che il mio codice sta cercando di chiamare qualcosa che non può essere chiamato. Qual è il mio codice che sta cercando di chiamare?"
  • "Il codice sta cercando di fare appello socket. Dovrebbe essere richiamabile! È la variabile socketche penso sia?`
  • Dovrei stampare cos'è il socket e controllare print socket

Attualmente sto imporitng socket in questo modo: da socket import *
user551717

L'ho anche cambiato da socket di importazione socket e sto ancora ottenendo lo stesso errore.
user551717

@utente: se lo fai print socketvedrai che il nome socketè un modulo. Deve essere stato associato a quel modulo da qualche parte ! Leggi attentamente il tuo codice e sono sicuro che vedrai uno import socketo alcuni di questi in cui non ti aspetti.
Katriel,

2
Ohh ho capito. L' socket.socketera un po 'di confusione. L'ho fatto semplicemente import write_to_filee poi, dato che il metodo che stavo usando all'interno write_to_file.pyè chiamato writeToTextFileI semplicemente randwrite_to_file.writeToTextFile
maudulus,

9
Vale la pena notare che questo non era ovvio per almeno 133 persone che hanno impiegato del tempo per votare (incluso me stesso) che non lo capivano. Ora, è ovvio, e la prossima volta che raggiungerò la mia casella degli strumenti, troverò questo strumento quando un modulo viene segnalato come "non richiamabile". Iniziare con una nuova lingua è la parte più difficile.
jmort253,

168

Supponiamo che il contenuto di YourClass.py sia:

class YourClass:
    # ......

Se usi:

from YourClassParentDir import YourClass  # means YourClass.py

In questo modo, ho ottenuto TypeError: l'oggetto 'module' non è richiamabile se si tenta di utilizzare YourClass().

Ma se usi:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

o usare YourClass.YourClass(), funziona per me.


2
class = YourClass.YourClass ()
KunMing Xie il

2
Ho risolto questo problema utilizzando dall'importazione YourClass *
Keith il

104

Aggiungi alla principale __init__.pyin YourClassParentDir, ad esempio:

from .YourClass import YourClass

Quindi, avrai un'istanza della tua classe pronta quando la importi in un altro script:

from YourClassParentDir import YourClass

5
Non dovrebbe essere from .YourClass import YourClass nel __init__.pyfile?
Nicolas Seiller,

28

Ecco un altro gotcha, che mi ci è voluto un po 'per vedere anche dopo aver letto questi post. Stavo installando uno script per chiamare i miei script bin Python. Anche il modulo non era richiamabile.

Il mio zig era che stavo facendo quanto segue:

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

quando il mio zag doveva fare quanto segue:

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

In sintesi, ricontrolla il pacchetto e l'annidamento del modulo.

Quello che sto cercando di fare è avere una directory di script che non abbia l'estensione * .py e che abbia ancora i moduli 'bin' in mypackage / bin e questi abbiano la mia estensione * .py. Sono nuovo nel packaging e cerco di seguire gli standard mentre li interpreto. Quindi, ho il root di installazione:

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

Se questo non è conforme allo standard, per favore fatemi sapere.


22

Sembra che ciò che hai fatto sia stato importato socketcome modulo import socket. Pertanto socketè il modulo. È necessario modificare quella riga in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), così come ogni altro uso del socketmodulo, o modificare l'istruzione import in from socket import socket.

O hai un import socketdopo il tuo 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

Ho importato socket come: da socket import * Posso cambiarlo, ma ci vorrà un po ', quindi sono riluttante.
user551717

@user Probabilmente in seguito da qualche parte ne import socketavrai uno , che importerà il modulo che socketsovrascrive la classe socket. Vedi lo snippet di codice in modifica.
Moinudin,

3
@utente: dovresti cambiarlo. Il motivo per cui le from <...> import *importazioni sono cattive, cattive, cattive è più o meno questo: normalmente sai esattamente cosa c'è nello spazio dei nomi globale, perché è esattamente quello che hai messo lì. Ma quando si import *riempie quello spazio dei nomi con ogni sorta di roba definita da altri moduli. In questo caso, non è chiaro da dove socketprovenga il nome : è il modulo o qualcosa definito in quel modulo? Se usi sempreimport socket o from socket import socket, non avrai mai questo problema, poiché puoi vedere esattamente quali nomi sono in uso.
Katriel,

va bene. Grazie per il consiglio. Ho appena preso l'abitudine da molti tutorial.
user551717

7

So che questa discussione ha un anno, ma il vero problema è nella tua directory di lavoro.

Credo che la directory di lavoro sia C:\Users\Administrator\Documents\Mibot\oops\. Controlla il file indicato socket.pyin questa directory. Una volta trovato, rinominalo o spostalo. Quando si importa socket, socket.pyviene utilizzata la directory corrente anziché la socket.pydirectory di Python. Spero che questo abbia aiutato. :)

Nota: non utilizzare mai i nomi dei file dalla directory di Python per salvare il nome del file del programma; entrerà in conflitto con i tuoi programmi.


1
Questo è sicuramente degno di nota. Stavo solo provando un rapido controllo con socket, quindi ho semplicemente chiamato il file socket.py. Bene, questo stava causando questo stesso identico messaggio di errore. Questa pagina mi ha messo sulla strada giusta: python-notes.curiousefficiency.org/en/latest/python_concepts/…
Czechnology

0

Durante la configurazione di un punto di accesso console_scripts in setup.py ho riscontrato che questo problema esisteva quando l'endpoint era un modulo o pacchetto anziché una funzione all'interno del modulo.

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

Per esempio

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

Avrebbe dovuto essere

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

In modo che si riferisca a una funzione richiamabile piuttosto che al modulo stesso. Sembra che non faccia alcuna differenza se il modulo ha un if __name__ == '__main__':blocco. Ciò non renderà il modulo richiamabile.


0

Suppongo che tu abbia ignorato la funzione / variabile incorporata o qualcos'altro "modulo" impostando la variabile globale "modulo". basta stampare il modulo per vedere cosa contiene.


0

controllare le dichiarazioni di importazione poiché un modulo non è richiamabile. In Python, tutto (incluse funzioni, metodi, moduli, classi ecc.) È un oggetto.


-1

Un modo semplice per risolvere questo problema è esportare l' PYTHONPATHambiente variabile. Ad esempio, per Python 2.6 in Debian / GNU Linux:

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

In altri sistemi operativi, dovresti prima trovare la posizione di questo modulo o del socket.pyfile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.