python-3.x - 导入错误 : No module named 'pysqlite2' when running tests in Python 3 Ubuntu

标签 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 的一部分,但是为什么在运行测试时找不到它?

最佳答案

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

bin/python -c 'import sqlite3'

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

在 Ubuntu 上,您需要安装 libsqlite3-dev 来获取这些 header 。

您可能缺少其他依赖项;在 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 可以在没有它们的情况下工作,但某些模块会变慢(例如,没有 mpdecimal librarydecimal)。

您可能想要验证 Ubuntu Python 3.4 source package dependencies适用于您的 Ubuntu 版本。

关于python-3.x - 导入错误 : No module named 'pysqlite2' when running tests in Python 3 Ubuntu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29022473/

相关文章:

django - 'str' 的 Pylint Django 模型实例没有成员

python - 如何获取两个日期之间的日期

python - SQLAlchemy 和 pylons 错误 "Could not locate a bind configured on mapper"

python - 什么是查看 SQLAlchemy 事务的一般好方法,包括经过身份验证的用户等?

python - 如何在 SQLAlchemy(核心)中创建文字 where 列?

python - 请求 UnicodeEncodeError : error

python - 在 Python tkinter 中使用按钮计数器

java - Android SQLite - 尝试访问单行时出现 NullPointerException 但可以访问整个数据吗?

javascript - 如何通过 Javascript 从 HTML 文件连接到 Sqlite 数据库

ios - 如何使用 swift 在 iOS coredata sqlite 中启用删除模式