繁体   English   中英

类型错误:“模块”object 不可调用

[英]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。 模块对象是您在导入模块时获得的事物类型。 您试图做的是在模块对象中调用一个对象,该对象恰好与包含它的模块具有相同的名称。

这是一种逻辑上分解此类错误的方法:

  • module object is not callable 。Python 告诉我我的代码试图调用无法调用的东西。我的代码试图调用什么?”
  • “代码试图调用socket 。那应该是可调用的!变量socket是我认为的吗?`
  • 我应该打印出什么是套接字并检查print socket

假设YourClass.py的内容是:

class YourClass:
    # ......

如果您使用:

from YourClassParentDir import YourClass  # means YourClass.py

这样,如果您随后尝试调用YourClass() ,您将收到TypeError: 'module' object is not callable

但是,如果您使用:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

或使用YourClass.YourClass() ,它的工作原理。

添加到 YourClassParentDir 中的主要__init__.py ,例如:

from .YourClass import YourClass

然后,当您将它导入另一个脚本时,您将准备好您的类的一个实例:

from YourClassParentDir import YourClass

这是另一个问题,即使在阅读了这些帖子后,我也花了一段时间才看到。 我正在设置一个脚本来调用我的 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 模块中是一个 .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.

希望有帮助! 快乐编码!

您所做的似乎是将socket模块import socketimport socket 因此socket是模块。 您需要将该行更改为self.serv = 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

我知道这个线程已经有一年了,但真正的问题出在你的工作目录中。

我相信工作目录是C:\\Users\\Administrator\\Documents\\Mibot\\oops\\ 请检查此目录中名为socket.py的文件。 找到后,重命名或移动它。 当你输入插座, socket.py从当前目录是用来代替socket.py从Python的目录。 希望这有帮助。 :)

注意:切勿使用 Python 目录中的文件名来保存程序的文件名; 它会与您的程序冲突。

我遇到了同样的问题。 然后我尝试不使用from YourClass import YourClass

我只是复制了 YourClass.py 的整个代码并在主代码(或当前代码)上运行它。它解决了错误

在 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__':块似乎没有区别。 这不会使模块可调用。

我猜您已经通过设置全局变量“模块”覆盖了内置函数/变量或其他“模块”。 只需打印模块,看看里面有什么。

这是我偶然发现并困惑了一段时间的可能的额外边缘情况,希望它可以帮助某人:

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尝试在b.py之前加载a.py 这意味着当b.py尝试加载a它获取模块而不是函数 - 这意味着您将收到错误消息module object is not callable

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

from .a import a
from .b import b

或者,如果这会产生循环依赖,请更改您的文件名以与函数不匹配,并直接从文件加载而不是依赖__init__.py

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

import socket

接着

socket.socket(...)

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

import socket as sock

然后使用

sock.socket(...)

我在下面遇到了同样的错误:

类型错误:“模块”对象不可调用

调用time()打印时如下图:

import time

print(time()) # Here

所以,我调用了time.time()如下所示:

import time

print(time.time()) # Here

或者,我从time导入time如下所示:

from time import time # Here

print(time()) 

然后,错误解决了:

1671301094.5742612

当我尝试将 optuna(一个用于超参数调整的库)与 LightGBM 一起使用时,我遇到了这个错误。 经过一个小时的努力,我意识到我正在直接导入 class,这造成了一个问题。

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文件时,我确定了适合我的模块(我正在处理回归问题)。 因此,我导入了 LGBMRegressor 并将我的代码中的lgb 替换为 LGBMRegressor 它开始工作了。

在此处输入图像描述

如果您正在导入整个类/目录(错误地)或 class 中的目标模块,您可以签入您的代码。

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)

解决这个问题的一个简单方法是导出PYTHONPATH变量环境。 例如,对于 Debian/GNU Linux 中的 Python 2.6:

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

在其他操作系统中,您将首先找到此模块或socket.py文件的位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM