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

2024-12-16 08:35:00
admin
原创
156
摘要:问题描述:File "C:UsersAdministratorDocumentsMibotoopslinkserv.py", line 82, in __init__ self.serv = socket(AF_INET,SOCK_STREAM) TypeError: 'modu...

问题描述:

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.pyPython 目录。希望这有帮助。:)

注意:切勿使用 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__.pywhich 加载。这意味着当尝试加载时,它会获取模块而不是函数 - 这意味着您将收到错误消息b.py`a.pyb.pya`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__.pyLGB 安装的 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 中,一切(包括函数、方法、模块、类等)都是对象。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用