TypeError: 'モジュール'オブジェクトは呼び出し不可能です


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

このエラーが発生するのはなぜですか?よくわかりません。

私の質問に答えるために何を知る必要がありますか?


8
(グローバル)変数と同じ名前の関数の両方があったため、このエラーが発生しました。
レムスタタ2017年

回答:


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があなたがそれを予期しないところまたはいくつかのそのようなものを見ることになると私は確信しています。
Katriel 2010

2
わかった。socket.socket少し混乱しました。私は単純にやったimport write_to_fileし、その後、私は内部を使用していた方法があるためwrite_to_file.py命名されwriteToTextFile、私は単にランドwrite_to_file.writeToTextFile
maudulus

9
これは、これを理解しなかった投票者(私も含む)に時間を費やした少なくとも133人にとっては明らかではなかったことは注目に値します。さて、それは明らかで、次回ツールボックスにアクセスしたときに、モジュールが「呼び出し不可能」と報告されたときにこのツールを見つけます。新しい言語を使い始めるのが最も難しい部分です。
jmort253 2014

168

YourClass.pyの内容が次のとおりであると想定します。

class YourClass:
    # ......

使用する場合:

from YourClassParentDir import YourClass  # means YourClass.py

このようにして、TypeErrorを取得しましたを使用しようとした場合、「モジュール」オブジェクトを呼び出すことができませんYourClass()

ただし、使用する場合:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

またはを使用するとYourClass.YourClass()、私にとってはうまくいきます。


2
class = YourClass.YourClass()
KunMing Xie

2
fromClassインポートを使用してこの問題を解決しました*
Keith

104

__init__.pyYourClassParentDir のメインに追加します。例:

from .YourClass import YourClass

その後、別のスクリプトにインポートすると、クラスのインスタンスの準備が整います。

from YourClassParentDir import YourClass

5
それfrom .YourClass import YourClass__init__.pyファイルにあるべきではありません か?
Nicolas Seiller

28

これらは、これらの投稿を読んだ後でも、しばらく見てから見逃してしまいました。私は自分のpython binスクリプトを呼び出すスクリプトを設定していました。モジュールも呼び出し不可能になりました。

私のジグは、私が次のことをしていたということでした:

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

私のザグが次のことをする必要があるとき:

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

要約すると、パッケージとモジュールのネストを再確認してください。

私がやろうとしているのは、*。py拡張子のないスクリプトディレクトリがあり、mypackage / binに「bin」モジュールがまだあり、これらに* .py拡張子があることです。私はパッケージングに慣れていないので、標準を解釈しながら解釈します。だから、私はセットアップルートにいます:

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

私はソケットを次のようにインポートしました:from socket import *それを変更することはできますが、しばらく時間がかかるので、仕方がありません。
user551717

@userおそらくどこかで、クラスをオーバーライドするimport socketモジュールをインポートします。編集中のコードスニペットを参照してください。socketsocket
moinudin 2010

3
@ユーザー:変更する必要があります。その理由のfrom <...> import *輸入があり、悪い、悪い、悪いは、多かれ少なかれ、これを次のとおりです。通常、あなたはそれはあなたがそこに置かれているまさにだから、グローバル名前空間にあります正確に何を知っています。しかし、あなたがimport *そのとき、あなたはその名前空間を他のモジュールが定義するあらゆる種類のもので満たします。この場合、名前の由来socketは不明です-それはモジュールですか、それともそのモジュールで定義されたものですか?あなたがいる場合、常に使用するimport socketか、from socket import socketあなたは正確に使用されているどのような名前を見ることができるので、あなたは、この問題を抱えていることはありません。
カトリエル

はい。先端をありがとう。私はたくさんのチュートリアルからただ癖をつけました。
user551717

7

このスレッドは1年前のものですが、実際の問題は作業ディレクトリにあります。

作業ディレクトリはだと思います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/...
Czechnology

0

setup.pyでconsole_scriptsエントリーポイントを構成するときに、エンドポイントがモジュール内の関数ではなくモジュールまたはパッケージである場合にこの問題が存在することに気付きました。

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変数環境をエクスポートすることです。たとえば、Debian / GNU LinuxのPython 2.6の場合:

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

他のオペレーティングシステムでは、このモジュールまたはsocket.pyファイルの場所を最初に見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.