python错误:TypeError: 'module' object is not callable 解决方法

python错误:TypeError: 'module' object is not callable 解决方法,这是我这两天遇到最头疼的事情,下面对这个bug提供自己的解决思路,希望能与同道人互相学习。

目录

1.介绍一下我的项目目录以及遇到次错误的解决方法

2.常见的几种命令:

3.模块的知识

(1)模块的优点

(2)模块的种类

4.包的知识

(1)常见的目录结构

(2)包的使用

(3)from。。。。。import


1.介绍一下我的项目目录以及遇到次错误的解决方法

首先上传一下我找到的一个项目的目录,明确一下方向:

 我在运行keywords文件下的TextrankExtractor.py时出现TypeError: 'module' object is not callable报错,原因在于我的TextrankExtractor.py这个程序既调用了commons下的ChineseStopKeywords.py和SegmentFactory,以及 wordVector.py模块,又调用了keywords文件下graph文件中的ClusterWordGraph、WeightedPositionWordGraph及Word2VecWordGraph模块,如果不import清楚,就会发生 'module' object is not callable。

调用不同路径下的模块,首先要引入模块的绝对路径,如果不清楚模块的绝对路径,可以通过sys代码获得:

import sys
a = os.path.abspath(-file-)  #获得绝对路径
print(a)
print(os.path.dirname(a))  # 得到上一层路径
base_dir = os.path.dirname(os.path.dirname(a))  # 得到上上一层路径
print(base_dir)
sys.path.append(base_dir)

 在获得绝对路径时,在你要执行的主程序中引入模块,具体通过一下例子

import sys
sys.path.append('D:\\pyworkspace\\11\\python_KeyExtractor\\commons')
import ChineseStopKeywords
import SegmentFactory
from commons import wordVector
sys.path.append('D:\\pyworkspace\\11\\python_KeyExtractor\\keywords\\graph')
import ClusterWordGraph
import WordGraph
from log import get_logger
from keywords.graph.ClusterWordGraph import ClusterWordGraph
from keywords.graph.WeightedPositionWordGraph import WeightedPositionWordGraph
from keywords.graph.Word2VecWordGraph import Word2VecWordGraph

2.常见的几种命令:

import example  #表示调用example模块

from example import example # 调用example模块中的一个example方法

from test import example  #test为包名,example为模块名,一层嵌套结构

from test.test1 import example  #test 、test1为包名,test1在test中,example为模块名

from test.test1。funct1 import example  #funct是example模块中的一个funct1方法

import test  #test为包名,此命令相当于执行了_init_文件

3.模块的知识

(1)模块的优点

这点大家应该耳熟能详,就是两个:高可维护性和减小代码的编写量

(2)模块的种类

Python标准库;第三方模块;应用程序自定义模块

4.包的知识

这部分是从其他博客中学习的,感觉这部分知识点挺多的。

首先在我的理解中包就是一个文件夹,必须包含有_init_.py文件。

官网的解释是:Packages are a way of structuring Python’s module namespace by using “dotted module names”,意思就是包是一种通过使用.模块名来组织Python模块名称空间的方式。

在Python3中,即使包下没有_init_。py文件,import包依然不会报错,包是为了被导入使用,方便程序的调用。

(1)常见的目录结构

glance/                   #Top-level package

├── __init__.py      #Initialize the glance package

├── api                  #Subpackage for api

│   ├── __init__.py

│   ├── policy.py

│   └── versions.py

├── cmd                #Subpackage for cmd

│   ├── __init__.py

│   └── manage.py

└── db                  #Subpackage for db

    ├── __init__.py

    └── models.py


test/                     #Top-level package,与glance同级别
├── __init__.py      #Initialize the glance package
└── mou.py      #Initialize the glance package
#文件内容

#policy.py
def get():
    print('from policy.py')

#versions.py
def create_resource(conf):
    print('from version.py: ',conf)

#manage.py
def main():
    print('from manage.py')

#models.py
def register_models(engine):
    print('from models.py: ',engine)

(2)包的使用

#在与包glance同级别的文件中测试
#主程序mou.py

import glance.db.models  #d导入glance包下的子包db中的models模块
glance.db.models.register_models('mysql') 

单独导入包名称时不会导入包中所有包含的所有子模块,如

#在与glance同级的mou.py中
import glance
glance.cmd.manage.main()

'''
执行结果:
AttributeError: module 'glance' has no attribute 'cmd'

解决方法:

#glance/__init__.py
from . import cmd

#glance/cmd/__init__.py
from . import manage

执行:
#在于glance同级的mou.py中
import glance
glance.cmd.manage.main()

(3)from。。。。。import

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法。

在mou.py文件中执行
from glance.db import models
models.register_models('oracle')
'''结果:
from models.py:  oracle
'''

from glance.db.models import register_models
register_models('mysql')
'''结果:
from models.py:  mysql

 

  • 17
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值