0

これは私の最初の投稿です。

私は 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)内のファイルを更新します。

「from sqlalchemy.exceptions」を「from 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()

エラーは、次のように詳細に発生します。

>>> 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")' ()
>>>

トライアウト: 次のようないくつかの解決策を自分で試しました。

エラーが示すように、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 の両方を同時に読み取らせるにはどうすればよいですか? その場合にのみ、エラーをスローすることなく両方のケースで機能する可能性があると思います。

誰かが同様の状況に遭遇しましたか? そして、どのように解決しましたか?または、他に試してみたいことはありますか?いくつかのライトを当ててください!

前もって感謝します!

4

2 に答える 2

0

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

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

于 2014-02-28T16:37:08.673 に答える
0

(1) CEDICT を機能させる方法は完全ではありません。「d = CEDICT()」はエラーになりませんが、「d.getFor(u'朋友')」などの辞書関数を使用するとエラーが発生します。構成ファイルに項目を追加する必要があります。

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

ただし、この方法でも「characterlookup」エラーが発生します(前述のとおり)。

(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'朋友')

編集:

cjklib.conf はデフォルト設定のままにします。

于 2012-05-08T21:36:23.200 に答える