成功安装cjklib和CEDICT后,当我使用它时,为什么会出现错误?

2024-06-01 06:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这里的第一篇文章。在

自从我开始学习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。焦油gz,解压缩并更新目录Cjklib-0.3/Cjklib/build/*.py中的文件(具体地说,生成器.py和init.py):

更新“自sqlalchemy.exceptions“到”从sql炼金术.exc““

^{pr2}$

错误发生的详细信息如下:

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

如果我删除我添加的行,它将再次按预期工作。在

解决方案:

我怎么能让它同时读呢塞迪克数据库以及cjklib.db公司同时?我猜,只有到那时,它才可能在两种情况下都有效,而不会产生任何错误。在

有人遇到过类似的情况吗?你怎么解决的?或者,你还想试试别的吗?请放几盏灯!在

提前谢谢!在


Tags: inpybuildexecutebasesqlalchemyinitegg
2条回答

在多线程环境中,当您在python中全局初始化CEDICT()对象,但随后尝试在新创建的线程中使用同一对象时,也可能发生此错误。在

解决方案是在要进行字典查找的线程中创建对象。在

(1)您使CEDICT工作的方法不完整。虽然“d=CEDICT()”不会引发任何错误,但是当您使用字典函数时,您将遇到一个错误,例如“d.getFor(u'26379;友')”。您应该在配置文件中添加一个项:

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

但是,这个方法仍然会给出一个“characterlookup”错误(如您所述)。在

(2)真正的解决方案:为字典显式创建“dbconnection”。在

^{pr2}$

编辑:

保持cjklib.conf默认配置。在

相关问题 更多 >