类型错误:“模块”对象不可调用
- 2024-12-16 08:35:00
- admin 原创
- 156
问题描述:
File "C:UsersAdministratorDocumentsMibotoopslinkserv.py", line 82, in __init__
self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable
为什么我会收到此错误?我很困惑。
我该如何解决这个错误?
解决方案 1:
socket
是一个模块,包含类socket
。
您需要执行socket.socket(...)
或from socket import socket
:
>>> import socket
>>> socket
<module 'socket' from 'C:Python27libsocket.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)
解决方案 2:
假设YourClass.py的内容为:
class YourClass:
# ......
如果您使用:
from YourClassParentDir import YourClass # means YourClass.py
这样,如果您尝试调用,您将得到TypeError: 'module' object is not callableYourClass()
。
但是,如果你使用:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
或者使用YourClass.YourClass()
,它可以起作用。
解决方案 3:
在 YourClassParentDir 中添加 main __init__.py
,例如:
from .YourClass import YourClass
然后,当你将其导入到另一个脚本时,你将拥有一个准备好的类实例:
from YourClassParentDir import YourClass
解决方案 4:
简短回答:您正在将文件/目录作为函数而不是真实函数调用
继续阅读:
这种错误发生在您导入模块并将其视为函数并调用它时。因此在 python 中模块是一个 .py 文件。包(目录)也可以被视为模块。假设我有一个create.py文件。在该文件中我有一个如下函数:
#inside create.py
def create():
pass
现在,在另一个代码文件中,如果我这样做:
#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here
当我将 create.py 文件作为函数调用时,出现了这个错误。所以我必须这样做:
from create import create
create() #now it works.
解决方案 5:
这是另一个问题,即使读完这些帖子,我也花了一段时间才发现。我正在设置一个脚本来调用我的 python bin 脚本。我也发现模块无法调用。
我的做法是:
from mypackage.bin import myscript
...
myscript(...)
当我的 zag 需要执行以下操作时:
from mypackage.bin.myscript import myscript
...
myscript(...)
总之,请仔细检查您的包和模块嵌套。
我想要做的是创建一个没有 .py 扩展名的脚本目录,并且仍然将“bin”模块放在 mypackage/bin 中,并且这些模块具有我的 .py 扩展名。我是打包新手,并尝试在解释标准时遵循这些标准。因此,我在设置根目录中有:
setup.py
scripts/
script1
mypackage/
bin/
script1.py
subpackage1/
subpackage_etc/
如果这不符合标准,请告诉我。
解决方案 6:
看起来您所做的就是将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
解决方案 7:
我知道这个帖子已经有一年了,但真正的问题在于你的工作目录。
我认为工作目录是C:UsersAdministratorDocumentsMibotoops
。请检查此目录中的文件socket.py
。找到后,重命名或移动它。导入套接字时,socket.py
将使用当前目录,而不是socket.py
Python 目录。希望这有帮助。:)
注意:切勿使用 Python 目录中的文件名来保存程序的文件名;这会与程序冲突。
解决方案 8:
这是一个我偶然发现并困惑了一段时间的可能的额外边缘情况,希望它能对大家有所帮助:
在some_module/a.py
:
def a():
pass
在some_module/b.py
:
from . import a
def b():
a()
在some_module/__init__.py
:
from .b import b
from .a import a
main.py
:
from some_module import b
b()
然后因为当 main.py 加载 b 时,它会先尝试通过__init__.py
which 加载。这意味着当尝试加载时,它会获取模块而不是函数 - 这意味着您将收到错误消息b.py
`a.pyb.py
a`module object is not callable
此处的解决方案是交换顺序some_module/__init__.py
:
from .a import a
from .b import b
或者,如果这会产生循环依赖,请将文件名更改为与函数不匹配,然后直接从文件中加载,而不是依赖于__init__.py
解决方案 9:
我得到了以下同样的错误:
类型错误:“模块”对象不可调用
当调用time()打印时如下图所示:
import time
print(time()) # Here
因此,为了解决错误,我进行了time.time()
如下调用:
import time
print(time.time()) # Here
或者,我time
从时间导入,如下所示:
from time import time # Here
print(time())
另外,我在 Django View 中遇到了同样的错误,因为我使用@transaction
如下所示的方法:
# "views.py"
from django.http import HttpResponse
from django.db import transaction
# ↓ Here ↓
@transaction
def test(request):
return HttpResponse("Test")
因此,为了解决错误,我使用@transaction.atomic
如下所示的方法:
# "views.py"
from django.http import HttpResponse
from django.db import transaction
# ↓ Here ↓
@transaction.atomic
def test(request):
return HttpResponse("Test")
解决方案 10:
在 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__':
。这不会使模块可调用。
解决方案 11:
我遇到了同样的问题。然后我尝试不使用from YourClass import YourClass
我只是复制了 YourClass.py 的整个代码并在主代码(或当前代码)上运行它。它解决了错误
解决方案 12:
您正在使用模块名称而不是类名称
import socket
进而
socket.socket(...)
这个模块有点奇怪,但你也可以使用类似的东西
import socket as sock
然后使用
sock.socket(...)
解决方案 13:
我猜您已经通过设置全局变量“模块”覆盖了内置函数/变量或其他“模块”。只需打印模块即可查看其中的内容。
解决方案 14:
当我尝试将 optuna(一个用于超参数调整的库)与 LightGBM 结合使用时,出现了此错误。经过一个小时的努力,我意识到我直接导入了类,这导致了问题。
import lightgbm as lgb
def LGB_Objective(trial):
parameters = {
'objective_type': 'regression',
'max_depth': trial.suggest_int('max_depth', 10, 60),
'boosting': trial.suggest_categorical('boosting', ['gbdt', 'rf', 'dart']),
'data_sample_strategy': 'bagging',
'num_iterations': trial.suggest_int('num_iterations', 50, 250),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 1.0),
'reg_alpha': trial.suggest_float('reg_alpha', 0.01, 1.0),
'reg_lambda': trial.suggest_float('reg_lambda', 0.01, 1.0)
}
'''.....LightGBM model....'''
model_lgb = lgb(**parameters)
model_lgb.fit(x_train, y_train)
y_pred = model_lgb.predict(x_test)
return mse(y_test, y_pred, squared=True)
study_lgb = optuna.create_study(direction='minimize', study_name='lgb_regression')
study_lgb.optimize(LGB_Objective, n_trials=200)
这里,该行model_lgb = lgb(**parameters)
试图调用 cLass 本身。当我深入研究__init__.py
LGB 安装的 site_packages 文件夹中的文件(如下所示)时,我确定了适合我的模块(我正在研究回归问题)。因此,我导入了 LGBMRegressor,并用LGBMRegressor替换了代码中的lgb,它开始工作了。
您可以检查您的代码是否导入了整个类/目录(错误地)或类内的目标模块。
from lightgbm import LGBMRegressor
def LGB_Objective(trial):
parameters = {
'objective_type': 'regression',
'max_depth': trial.suggest_int('max_depth', 10, 60),
'boosting': trial.suggest_categorical('boosting', ['gbdt', 'rf', 'dart']),
'data_sample_strategy': 'bagging',
'num_iterations': trial.suggest_int('num_iterations', 50, 250),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 1.0),
'reg_alpha': trial.suggest_float('reg_alpha', 0.01, 1.0),
'reg_lambda': trial.suggest_float('reg_lambda', 0.01, 1.0)
}
'''.....LightGBM model....'''
model_lgb = LGBMRegressor(**parameters) #here I've changed lgb to LGBMRegressor
model_lgb.fit(x_train, y_train)
y_pred = model_lgb.predict(x_test)
return mse(y_test, y_pred, squared=True)
study_lgb = optuna.create_study(direction='minimize', study_name='lgb_regression')
study_lgb.optimize(LGB_Objective, n_trials=200)
解决方案 15:
在你的情况下尝试一下
from socket import socket
此外
#in a separate file you define a class like:
class one:
def __init__(self, name, value):
self.name = name
self.value = value
pass
#and in other file you define a other class.
#and you want use defined class inside it.like:
from one import one as clsOne #this model of import a class solve the error
class two:
item = clsOne("A", 22)
print(item.name)
pass
解决方案 16:
解决这个问题的一个简单方法是导出PYTHONPATH
变量环境。例如,对于 Debian/GNU Linux 中的 Python 2.6:
export PYTHONPATH=/usr/lib/python2.6`
在其他操作系统中,您首先会找到该模块或socket.py
文件的位置。
解决方案 17:
检查导入语句,因为模块不可调用。在 Python 中,一切(包括函数、方法、模块、类等)都是对象。