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