2012-05-07 7 views
0

これは私の最初の投稿です。cjklibとCEDICTを正常にインストールした後、私はそれを使用するとエラーが発生します。なぜですか?

私はPythonを学び始めて以来、私はここで投稿を読んできました。それは私の学習プロセスにとって大きな助けになりました。だから、ちょうど私の質問の前にすべてのあなたに大きな感謝を言いたい!

質問:

私は正常にcjklibパッケージをインストールしました。その後、CEDICT辞書も正常にインストールされました。しかし、私はCEDICTを使用しようとすると、それは常にこのようなエラーがスローされます。問題を再現するには

>>> d = CEDICT() 
...... 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py", line 335, in do_execute 
sqlalchemy.exc.OperationalError: (OperationalError) unknown database "cedict_0" 'PRAGMA "cedict_0".table_info("CEDICT")'() 
>>> 

を:

cjklibパッケージをインストールします。

はcjklib-0.3をダウンロードしてください。 tar.gzを展開し、ディレクトリCjklib-0.3/cjklib/build/*。py(具体的には、builder.pyおよびinit .py)のファイルを更新します。

>>> d = CEDICT() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dictionary/__init__.py", line 605, in __init__ 
    super(CEDICT, self).__init__(**options) 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dictionary/__init__.py", line 532, in __init__ 
    super(EDICTStyleEnhancedReadingDictionary, self).__init__(**options) 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dictionary/__init__.py", line 269, in __init__ 
    if not self.available(self.db): 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dictionary/__init__.py", line 276, in available 
    and dbConnectInst.hasTable(cls.DICTIONARY_TABLE)) 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dbconnector.py", line 444, in hasTable 
    schema = self._findTable(tableName) 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dbconnector.py", line 429, in _findTable 
    if hasTable(tableName, schema=schema): 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2525, in has_table 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2412, in run_callable 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1959, in run_callable 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/dialects/sqlite/base.py", line 567, in has_table 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1450, in execute 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1627, in _execute_text 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1697, in _execute_context 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1690, in _execute_context 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py", line 335, in do_execute 
sqlalchemy.exc.OperationalError: (OperationalError) unknown database "cedict_0" 'PRAGMA "cedict_0".table_info("CEDICT")'() 
>>> 

入団テスト:エラーは以下のように、詳細には、発生した "sqlalchemy.exceptionsから"更新 "sqlalchemy.excから" へ

$cd djklib-0.3/cjklib/build/ 
$sudo python setup.py install 
$sudo installcjkdict CEDICT 
$python 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from cjklib.dictionary import CEDICT 
>>> d = CEDICT() 

を私は、いくつかの解決策を自分で試してみましたlike:

エラーが示されたので、sqliteデータベースファイル内にテーブルが見つからないため、次の行を追加してcjklib.confファイルを編集して、ここにテーブルがあることを伝えます。

url = sqlite:////usr/local/share/cjklib/cedict.db 

次に、CEDICTテーブルが見つかり、エラーをスローしました。しかし残念ながら、それは私は以下のコードを実行したときに、エラーの別の種類を投げ始めた:

>>> from cjklib import characterlookup 
>>> cjk = characterlookup.CharacterLookup('T') 

エラー:私は、私が追加した行を削除した場合、再び、予想通り

>>> cjk = characterlookup.CharacterLookup('T') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/characterlookup.py", line 118, in __init__ 
    self.hasComponentLookup = self.db.hasTable('ComponentLookup') 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dbconnector.py", line 444, in hasTable 
    schema = self._findTable(tableName) 
    File "/usr/local/lib/python2.7/dist-packages/cjklib/dbconnector.py", line 429, in _findTable 
    if hasTable(tableName, schema=schema): 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2525, in has_table 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2412, in run_callable 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1959, in run_callable 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/dialects/sqlite/base.py", line 567, in has_table 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1450, in execute 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1627, in _execute_text 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1697, in _execute_context 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1690, in _execute_context 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py", line 335, in do_execute 
sqlalchemy.exc.OperationalError: (OperationalError) unknown database "cjklib_0" 'PRAGMA "cjklib_0".table_info("ComponentLookup")'() 

、それが動作します。

ソリューション:

どのように私はそれが同時にcedict.dbとcjklib.dbの両方を読むことができますか?私は推測しています、それだけで、エラーを投げずに両方のケースでうまくいくかもしれません。

誰も同じような状況に遭遇しましたか?そしてそれをどうやって解決しましたか?それとも、他に何か心に留めておいてもらえますか?ちょうどいくつかの光を捨ててください!

ありがとうございます!

答えて

0

(1)CEDICTを動作させる方法は、は完了していません。です。"d = CEDICT()"はエラーを発生させませんが、 "d.getFor(u '朋友')"などの辞書関数を実行するとエラーになります。

attach = sqlite:////usr/local/share/cjklib/cjklib.db 

ただし、この方法でも(前述のように)「文字の表示」エラーが発生します。

(2)実際の解決策:辞書に明示的に "dbconnection"を作成します。

>>> from cjklib.dictionary import CEDICT 
>>> from cjklib.dbconnector import getDBConnector 
>>> db = getDBConnector({'sqlalchemy.url': 'sqlite://', 'attach': ['cjklib']}) 
>>> d=CEDICT(dbConnectInst=db) 
>>> it=d.getFor(u'朋友') 

EDIT:

デフォルトの設定でcjklib.confしてください。

+0

あなたの答えは呉梁にありがとうございました!それは完璧に動作し、あなたは素晴らしいです! – phoenixbai

+0

@phoenixbai、正しい回答として選択してください。ありがとう。 – wuliang

+0

ちょうどいいよ!私はここで新しいので、まだ人々を賞賛する方法を知らなかった! – phoenixbai

0

このエラーは、CEDICT()オブジェクトをPythonでグローバルに初期化した後に、新しく作成したスレッドで同じオブジェクトを使用しようとすると、マルチスレッド環境でも発生する可能性があります。

解決策は、辞書ルックアップを行うスレッド内にオブジェクトを作成することです。

関連する問題