1. ホーム
  2. パイソン学習

python エラー。TypeError: 'module' オブジェクトは呼び出し可能ではありません Solution

2022-02-23 20:26:04

Python エラー。TypeError:'モジュール'オブジェクトは呼び出し可能ではありません解決策は、これは私が過去2日間で遭遇した最も頭痛の種であり、以下は、このバグに独自のソリューションを提供することです、私は同じ人々とお互いから学ぶことを望む。

内容

1. 私のプロジェクトディレクトリの紹介と、遭遇したサブエラーの解決法

2. よく使うコマンドをいくつか紹介します。

3. モジュールに関する知識

(1)モジュールの優位性

(2)モジュールの種類

4. パッケージに関する知識

(1)共通ディレクトリ構造

(2)パッケージの利用

(3) from.


1. 私のプロジェクトディレクトリの紹介と、遭遇したサブエラーの解決法

まず方向性を明確にするために、見つけたプロジェクトのディレクトリをアップロードする。

 TextrankExtractor.pyをkeywordsファイルの下で実行すると、TypeError: 'module' object is not callableが発生します。私のプログラムTextrankExtractor.pyはChineseStopKeywords.pyとSegmentFactory、そしてwordVector.pyモジュールを呼び出し、ClusterWordGraph、 WeightedPositionWordGraph、Word2VecWordGraphモジュールも呼ぶので、明確にimportしなければ、 'module' object is not callableということになるのでしょうね。

異なるパスでモジュールを呼び出すには、まずモジュールの絶対パスを導入します。モジュールの絶対パスが明確でない場合は、sysコードから取得できます。

import sys
a = os.path.abspath(-file-) #Get the absolute path
print(a)
print(os.path.dirname(a)) # get the upper level path
base_dir = os.path.dirname(os.path.dirname(a)) # get the upper level path
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 はモジュール名で、1レベルのネスト構造です。

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 ファイルを含む必要があるフォルダのことです。

公式の説明では、パッケージは "dotted module names" を使って Python のモジュール名前空間を構造化する方法、つまりパッケージは .module name を使って Python のモジュール名前空間を整理するものである、とされています。

<ブロッククオート

Python 3 では、パッケージの下に _init_.py ファイルがなくても、パッケージをインポートしてもエラーは報告されません; パッケージは、使用と簡単なプログラム起動のためにインポートされることを意味します。

(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, same level as glance
├── __init__.py #Initialize the glance package
└── mou.py #Initialize the glance package
#File contents

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



#Test in a file at the same level as the package glance
#main program mou.py

import glance.db.models #d import the models module in db, a subpackage under the glance package
glance.db.models.register_models('mysql') 

(2)パッケージの利用

# In mou.py, which is at the same level as glance
import glance
glance.cmd.manage.main()

'''
Execution result.
AttributeError: module 'glance' has no attribute 'cmd'

Solution.

#glance/__init__.py
from . import cmd

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

Execution.
#is in mou.py at the same level as glance
import glance
glance.cmd.manage.main()

パッケージ名だけをインポートしても、そのパッケージに含まれるすべてのサブモジュールはインポートされない、例.

Execute in the mou.py file
from glance.db import models
models.register_models('oracle')
'''Result.
from models.py: oracle
'''

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


(3) from 。

<ブロッククオート

import fromの後にインポートされるモジュールは、明示的にドットで囲むことができないものでなければならないことに注意してください。そうでなければ、例えばfrom a import b.cは間違った構文になるため、構文エラーが発生します。

Execute in the mou.py file
from glance.db import models
models.register_models('oracle')
'''Result.
from models.py: oracle
'''

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