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

为什么我得到这个错误? 我困惑。

如何解决这个错误?


当前回答

这里有一个可能的额外边缘情况,我偶然发现并困惑了一段时间,希望它能帮助到一些人:

在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,它会在a.py之前尝试加载b.py。这意味着当b.py尝试加载一个对象时,它得到的是模块而不是函数——这意味着你将得到错误消息:模块对象不可调用

这里的解决方案是交换some_module/__init__.py中的顺序:

from .a import a
from .b import b

或者,如果这将创建一个循环依赖,请更改您的文件名,使其与函数不匹配,并直接从文件加载,而不是依赖__init__.py

其他回答

您使用了模块的名称而不是类的名称 使用

import socket

然后

socket.socket(...)

这是一个奇怪的模块,但你也可以使用类似的东西

import socket as sock

然后使用

sock.socket(...)

看起来你所做的是导入socket模块作为import socket。因此socket就是模块。你需要把这一行改成self。Serv = socket.socket(socket. socket)AF_INET, socket. sock_stream),以及其他任何使用socket模块的情况,或者将import语句更改为from socket import socket。

或者在你的from socket import *之后有一个import socket:

>>> 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

这是另一个陷阱,即使在阅读这些帖子之后,我也花了一段时间才看到。我正在设置一个脚本来调用我的python bin脚本。我也得到了不可调用的模块。

我的zig是我正在做以下事情:

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/

如果不符合标准,请让我知道。

检查导入语句,因为模块是不可调用的。 在Python中,所有东西(包括函数、方法、模块、类等)都是对象。

当我试图在LightGBM中使用optuna(一个用于超参数调优的库)时,我遇到了这个错误。经过一个小时的挣扎,我意识到我直接导入类,这是一个问题。

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本身。 当我深入到LGB安装的site_packages文件夹中的__init__.py文件时,我确定了适合我的模块(我正在处理回归问题)。因此,我导入了lbmregressor,并用lbmregressor替换了我代码中的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)