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
。電話できないものに電話しようとしているようです。電話しようとしているのは不思議ですか」socket
と呼んでいます。それは呼び出し可能であるべきです!私は変数socket
が私がそれだと思うものであるかどうか疑問に思いますか?」print socket
YourClass.py の内容が次のようになっているとします。
class YourClass:
# ......
あなたが使用する場合:
from YourClassParentDir import YourClass # means YourClass.py
このようにして、私は TypeErrorを得ました: 'module'オブジェクトは呼び出し可能ではありません もしあなたがYourClass()
を使おうとしたら。
しかし、あなたが使用する場合:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
またはYourClass.YourClass()
を使用してください、それは私のために働きます。
YourClassParentDirのメインの__init__.py
に追加します。
from .YourClass import YourClass
これで、クラスのインスタンスを別のスクリプトにインポートしたときに準備が整います。
from YourClassParentDir import YourClass
これらの記事を読んだ後でも、しばらく時間がかかりました。私は自分の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
モジュールを使用する場合も、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
私はこのスレッドが1歳であることを知っています、しかし本当の問題はあなたの作業ディレクトリにあります。
作業ディレクトリはC:\Users\Administrator\Documents\Mibot\oops\
だと思います。このディレクトリでsocket.py
という名前のファイルを確認してください。見つかったら、名前を変更するか移動します。ソケットをインポートすると、Pythonのディレクトリのsocket.py
の代わりに現在のディレクトリのsocket.py
が使用されます。これが役に立ったことを願っています。 :)
注: /プログラムのファイル名を保存するのにPythonのディレクトリからのファイル名を決して使用しないでください。それはあなたのプログラムと衝突します。
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__':
ブロックがあっても違いはないようです。これはモジュールを呼び出し可能にしません。
グローバル変数 "module"を設定することで、組み込み関数/変数、あるいは他の "module"をオーバーライドしたと思います。モジュールを印刷するだけで、その内容がわかります。
この問題を解決する簡単な方法は、変数PYTHONPATH
をエクスポートすることです。たとえば、Debian/GNU LinuxのPython 2.6の場合:
export PYTHONPATH=/usr/lib/python2.6`
他のオペレーティングシステムでは、最初にこのモジュールまたはsocket.py
ファイルの場所を見つけるでしょう。