0

おそらく簡単に解決できる奇妙な問題があります。

__init__およびメソッドを含むクラスデータベースがありexecuteDictMoreます(とりわけ)。

class Database():
    def __init__(self, database, server,login, password ):
        self.database = database
        my_conv = { FIELD_TYPE.LONG: int }
        self.conn = MySQLdb.Connection(user=login, passwd=password, db=self.database, host=server, conv=my_conv)
        self.cursor = self.conn.cursor()

    def executeDictMore(self, query):
        self.cursor.execute(query)
        data = self.cursor.fetchall()
        if data == None :
            return None
        result = []
        for d in data:
            desc = self.cursor.description
            dict = {}
            for (name, value) in zip(desc, d) :
                dict[name[0]] = value
            result.append(dict)
        return result

次に、このクラスをファイル db_functions.py でインスタンス化します。

from Database import Database
db = Database()

そして、db_functions の関数から executeDictMore メソッドを呼び出します。

def test(id):
    query = "SELECT * FROM table WHERE table_id=%s;" %(id)
    return db.executeDictMore(query)

奇妙な部分が来ます。db_functions をインポートして db_functions.test(id) を Python コンソールから呼び出すと、次のようになります。

import db_functions
t = db_functions.test(12)

それはうまく動作します。しかし、別の python ファイルから同じことを行うと、次のエラーが発生します。

AttributeError: Database instance has no attribute 'executeDictMore'

ここで何が起こっているのか本当にわかりません。別のデータベース クラスが干渉しているとは思いません。そして、モジュールが sys.path にあるフォルダーを追加するので、とにかく正しいモジュールを呼び出す必要があります。

誰かがアイデアを持っているなら、それは大歓迎です。

4

4 に答える 4

3

Databaseパスのどこかに別のモジュールまたはパッケージがあり、代わりにインポートされています。

他のモジュールが存在する場所を診断するには、次を追加します。

import Database
print Database.__file__

行の前from Database import Database; モジュールのファイル名を出力します。競合しないように、いずれかのモジュールの名前を変更する必要があります。

于 2013-08-13T09:01:38.110 に答える