ImportError: нет модуля с именем "pysqlite2" при запуске тестов в Python 3 Ubuntu

некоторый фон: у нас есть кодовая база, написанная на Python 3, которая использует пирамиду и SQLAlchemy ORM для сохранения в базе данных mysql. Для написания тестов для наших классов с помощью ORM мы используем Sqlite. Все это прекрасно работает вместе... в местном масштабе.

настройка нашего сервера Jenkins (Ubuntu) для запуска набора тестов, внутри virtualenv, мы сталкиваемся с проблемой. Тесты выполняются следующим образом:

coverage run --source src/ --omit=src/tests/ -m py.test

тесты, не связанные с ORM, в порядке. Те с ORM бросить эта ошибка:

____________________________________________________________ TestSGenre.test_get_all_success _____________________________________________________________

self = <tests.common.orm.models.test_s_genre.TestSGenre testMethod=test_get_all_by_discipline_success>

    def setUp(self):
        DBSession.remove()
>       self.engine = setup()

source/src/tests/common/orm/models/test_s_genre.py:13: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
source/src/tests/common/orm/orm_setup.py:7: in setup
    engine = create_engine('sqlite://', connect_args={'check_same_thread': False}, poolclass=StaticPool)
/var/www/hosts/company/virtualenv/swapenv/lib/python3.4/site-packages/sqlalchemy/engine/__init__.py:386: in create_engine
    return strategy.create(*args, **kwargs)
/var/www/hosts/company/virtualenv/swapenv/lib/python3.4/site-packages/sqlalchemy/engine/strategies.py:74: in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
/var/www/hosts/company/virtualenv/swapenv/lib/python3.4/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py:339: in dbapi
    raise e
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite'>

    @classmethod
    def dbapi(cls):
        try:
>           from pysqlite2 import dbapi2 as sqlite
E           ImportError: No module named 'pysqlite2'

/var/www/hosts/company/virtualenv/swapenv/lib/python3.4/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py:334: ImportError

проверка на sqlite3 (изнутри virtualenv) успешна:

(swapenv)user@jenkins:/var/lib/jenkins/workspace/SWAP_Unit_Test$ which sqlite3
/usr/bin/sqlite3

Это также успешно за пределами virtualenv. Мы попытались установить и переустановить все количество пакетов sqlite, sqlite-dev и т. д. Предположительно, библиотека Sqlite является частью Python 3, но тогда почему ее нельзя найти при запуске тестов?

2 ответов


вам не хватает модуля sqlite3 Python, который вы можете проверить с помощью:

bin/python -c 'import sqlite3'

The which sqlite3 команда показывает только, что у вас есть sqlite3 командная строка установлен; это не то, что Python использует. Он использует libsqlite3 общая библиотека (которую также использует инструмент командной строки). Если отсутствует, это означает, что Python не смог найти заголовки разработки SQLite при построении Python.

на Ubuntu, вам нужно установить libsqlite3-dev чтобы получить эти заголовки.

возможно, Вам не хватает других зависимостей; на Ubuntu я бы установил:

libreadline6-dev
libbz2-dev
libssl-dev
libsqlite3-dev
libncursesw5-dev
libffi-dev
libdb-dev
libexpat1-dev
zlib1g-dev
liblzma-dev
libgdbm-dev
libmpdec-dev

некоторые из них являются пакетами ускорителей; Python будет работать без них, но некоторые модули будут медленнее (например,decimal без mpdecimal библиотека).

вы можете проверить Ubuntu Python 3.4 зависимости от исходного пакета для вашей версии Ubuntu.


запуск Debian Buster, я обнаружил ту же проблему с python3.6, хотя, python3.5 успешно импортирован sqlite3. И хотя модуль sqlite3 был установлен и должен был быть доступен python3.6. Моим решением было запустить

export PYTHONPATH=$PYTHONPATH:/usr/lib/python3.6/lib-dynload

по какой-то причине я еще не определил, каталог модуля для python3.6 Не загружается правильно для sqlite3. Это решение работало как внутри, так и вне виртуальной среды.