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
このエラーが発生するのはなぜですか?よくわかりません。
私の質問に答えるために何を知る必要がありますか?
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
このエラーが発生するのはなぜですか?よくわかりません。
私の質問に答えるために何を知る必要がありますか?
回答:
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
print socket
すると、名前socket
がモジュールであることがわかります。どこかでそのモジュールにバインドされている必要があります!あなたのコードを注意深く読んでください、そしてあなたimport socket
があなたがそれを予期しないところまたはいくつかのそのようなものを見ることになると私は確信しています。
socket.socket
少し混乱しました。私は単純にやったimport write_to_file
し、その後、私は内部を使用していた方法があるためwrite_to_file.py
命名されwriteToTextFile
、私は単にランドwrite_to_file.writeToTextFile
YourClass.pyの内容が次のとおりであると想定します。
class YourClass:
# ......
使用する場合:
from YourClassParentDir import YourClass # means YourClass.py
このようにして、TypeErrorを取得しました:を使用しようとした場合、「モジュール」オブジェクトを呼び出すことができませんYourClass()
。
ただし、使用する場合:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
またはを使用するとYourClass.YourClass()
、私にとってはうまくいきます。
__init__.py
YourClassParentDir のメインに追加します。例:
from .YourClass import YourClass
その後、別のスクリプトにインポートすると、クラスのインスタンスの準備が整います。
from YourClassParentDir import YourClass
from .YourClass import YourClass
は__init__.py
ファイルにあるべきではありません か?
これらは、これらの投稿を読んだ後でも、しばらく見てから見逃してしまいました。私は自分の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/
これが規格に準拠していない場合は、お知らせください。
あなたがやったことは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
import socket
モジュールをインポートします。編集中のコードスニペットを参照してください。socket
socket
from <...> import *
輸入があり、悪い、悪い、悪いは、多かれ少なかれ、これを次のとおりです。通常、あなたはそれはあなたがそこに置かれているまさにだから、グローバル名前空間にあります正確に何を知っています。しかし、あなたがimport *
そのとき、あなたはその名前空間を他のモジュールが定義するあらゆる種類のもので満たします。この場合、名前の由来socket
は不明です-それはモジュールですか、それともそのモジュールで定義されたものですか?あなたがいる場合、常に使用するimport socket
か、from socket import socket
あなたは正確に使用されているどのような名前を見ることができるので、あなたは、この問題を抱えていることはありません。
このスレッドは1年前のものですが、実際の問題は作業ディレクトリにあります。
作業ディレクトリはだと思いますC:\Users\Administrator\Documents\Mibot\oops\
。socket.py
このディレクトリで指定されているファイルを確認してください。見つかったら、名前を変更するか移動します。ソケットをインポートsocket.py
するとsocket.py
、Pythonのディレクトリからではなく、現在のディレクトリからが使用されます。これがお役に立てば幸いです。:)
注:プログラムのファイル名を保存するためにPythonのディレクトリのファイル名を使用しないでください。プログラムと競合します。
socket.py
。まあ、それはこのまったく同じエラーメッセージを引き起こしていました。このページには、右のトラックに私を置く:python-notes.curiousefficiency.org/en/latest/python_concepts/...
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__':
ブロックがある場合、違いはないようです。これはモジュールを呼び出し可能にしません。