Почему есть ошибка сегментации с этим кодом?

Я не смог найти тег для модуля apsw.

import sqlitefts as fts
import os

from search import *
from search import OUWordTokenizer

import sys
def tokenize():
        with apsw.Connection('texts.db', flags=apsw.SQLITE_OPEN_READWRITE) as connection:
        c = connection.cursor()
        print("connection to cursor")
        fts.register_tokenizer(c, 'oulatin', fts.make_tokenizer_module(OUWordTokenizer('latin')))
    #fts.register_tokenizer(c, 'porter')
        print("registering tokenizer")
        c.execute("CREATE VIRTUAL TABLE IF NOT EXISTS text_idx USING fts3 (id, title, book, author, date, chapter, verse, passage, link, documentType, tokenize={})".format("oulatin"))
        c.execute("CREATE VIRTUAL TABLE IF NOT EXISTS text_idx_porter USING fts3 (id, title, book, author, date, chapter, verse, passage, link, documentType, tokenize={})".format("porter"))
        print("virtual table created")
        c.execute("COMMIT")
        c.execute("BEGIN")
        c.execute("INSERT INTO text_idx(id, title, book, author, date, chapter, verse, passage, link, documentType) SELECT id, title, book, author, date, chapter, verse, passage, link, documentType FROM texts")
        c.execute("INSERT INTO text_idx_porter(id, title, book, author, date, chapter, verse, passage, link, documentType) SELECT id, title, book, author, date, chapter, verse, passage, link, documentType FROM texts")
        print ("inserted data into virtual table")
        c.execute("COMMIT")

        stmt1='select id, title, book, author, link from text_idx where passage MATCH "saepe commeant atque"'
        stmt2='select id, title, book, author, link from text_idx_porter where passage MATCH "saepe commeant atque"'

        r1=c.execute(stmt1)
        print (type(r1))
        r2=c.execute(stmt2)
        print (type(r2))
        r3=(set(r2).union(set(r1)))
        print (type(r3))
        r4=list(r3)
        print (type(r4))
        print (r4)

Я получаю ошибку сегментации при запуске этого

выход:

bash-4.3# python3 app.py
connection to cursor
registering tokenizer
virtual table created
Segmentation fault (core dumped)

Код работал нормально, и я не внес никаких изменений с тех пор, я не знаю, почему это произошло. Я в тупике.

ОБНОВЛЕНИЕ:

Я попытался отладить код с помощью GDB, и это говорит об этом.

(gdb) run app.py
Starting program: /usr/bin/python3 app.py
connection to cursor
registering tokenizer
virtual table created
During startup program terminated with signal SIGSEGV, Segmentation fault.

Теперь я понимаю, что это не проблема с кодом, а с оболочкой или оболочкой. Как мне подойти к этому?

ОБНОВИТЬ:

fts.register_tokenizer(c, 'oulatin', fts.make_tokenizer_module(OUWordTokenizer('latin')))

это правильный способ зарегистрировать пользовательский токенизатор?

ОБНОВЛЕНИЕ: я отладил код локально с помощью GDB, и он говорит это.

 (gdb) run app.py
 Starting program: /usr/bin/python3 app.py
 [Thread debugging using libthread_db enabled]
 Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat 
 connection to cursor
 Traceback (most recent call last):
   File "app.py", line 52, in <module>
     tokenize()
   File "app.py", line 20, in tokenize
     fts.register_tokenizer(c, 'oulatin', fts.make_tokenizer_module(OUWordTokenizer('latin')))
   File "/usr/local/lib/python3.5/dist-packages/sqlitefts/tokenizer.py", line 191, in register_tokenizer
     r = c.execute('SELECT fts3_tokenizer(?, ?)', (name, address_blob))
   File "src/cursor.c", line 1019, in APSWCursor_execute.sqlite3_prepare
   File "src/statementcache.c", line 386, in sqlite3_prepare
   apsw.SQLError: SQLError: no such function: fts3_tokenizer
   [Inferior 1 (process 13615) exited with code 01]

Это заставляет меня думать, что при регистрации моего токенизатора есть некоторые проблемы. Какие-нибудь мысли?

0 ответов

Другие вопросы по тегам