ImportError:在Python 3 Ubuntu中运行测试时没有名为'pysqlite2'的模块

时间:2015-03-12 23:50:52

标签: python-3.x sqlite sqlalchemy

一些背景知识:我们有一个用Python 3编写的代码库,它使用Pyramid和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 个答案:

答案 0 :(得分:11)

您缺少sqlite3 Python模块,您可以通过以下方式验证:

bin/python -c 'import sqlite3'

which sqlite3命令仅显示您已安装sqlite3 命令行工具;这不是Python使用的。它使用libsqlite3共享库(命令行工具也使用)。如果缺少,则意味着Python在构建Python时无法找到SQLite开发头文件。

在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 library)。

您可能需要验证Ubuntu版本的Ubuntu Python 3.4 source package dependencies

答案 1 :(得分:1)

运行Debian Buster,我发现了python3.6的同样问题,即使python3.5成功导入了sqlite3。即使安装了sqlite3模块并且应该可以使用python3.6。我的解决方案是运行

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

由于某些原因我还没有确定,python3.6的模块目录没有为sqlite3正确加载。该解决方案适用于虚拟环境内部和外部。