web-dev-qa-db-ja.com

TypeError: 'module'オブジェクトは呼び出し不可能です

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

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

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

430
user551717

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。電話できないものに電話しようとしているようです。電話しようとしているのは不思議ですか」
  • 「ああ、私はsocketと呼んでいます。それは呼び出し可能であるべきです!私は変数socketが私がそれだと思うものであるかどうか疑問に思いますか?」
  • print socket
461
Katriel

YourClass.py の内容が次のようになっているとします。

class YourClass:
    # ......

あなたが使用する場合:

from YourClassParentDir import YourClass  # means YourClass.py

このようにして、私は TypeErrorを得ました: 'module'オブジェクトは呼び出し可能ではありません もしあなたがYourClass()を使おうとしたら。

しかし、あなたが使用する場合:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

またはYourClass.YourClass()を使用してください、それは私のために働きます。

103
Bowen Xu

YourClassParentDirのメインの__init__.pyに追加します。

from .YourClass import YourClass

これで、クラスのインスタンスを別のスクリプトにインポートしたときに準備が整います。

from YourClassParentDir import YourClass
88
Jose Alban

これらの記事を読んだ後でも、しばらく時間がかかりました。私は自分の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/

これが規格に準拠していない場合は、お知らせください。

25
zerocog

あなたがしたことがsocketモジュールをimport socketとしてインポートしたようです。したがってsocketはモジュールです。その行をself.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)に変更する必要があります。また、他のsocketモジュールを使用する場合も、importステートメントを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
20
marcog

私はこのスレッドが1歳であることを知っています、しかし本当の問題はあなたの作業ディレクトリにあります。

作業ディレクトリはC:\Users\Administrator\Documents\Mibot\oops\だと思います。このディレクトリでsocket.pyという名前のファイルを確認してください。見つかったら、名前を変更するか移動します。ソケットをインポートすると、Pythonのディレクトリのsocket.pyの代わりに現在のディレクトリのsocket.pyが使用されます。これが役に立ったことを願っています。 :)

注: /プログラムのファイル名を保存するのにPythonのディレクトリからのファイル名を決して使用しないでください。それはあなたのプログラムと衝突します。

7
blackwind

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 __== '__main__':ブロックがあっても違いはないようです。これはモジュールを呼び出し可能にしません。

0
Luke Exton

グローバル変数 "module"を設定することで、組み込み関数/変数、あるいは他の "module"をオーバーライドしたと思います。モジュールを印刷するだけで、その内容がわかります。

0
umairhhhs

この問題を解決する簡単な方法は、変数PYTHONPATHをエクスポートすることです。たとえば、Debian/GNU LinuxのPython 2.6の場合:

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

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

0
Oscar Ardila