如何从virtualenv中“导入apt”?

问题描述

我已经编写了一个Python工具脚本,该脚本依赖于Debian软件包python3-apt

import apt

...

def get_packages():
    cache = apt.Cache()
    for pkg in cache:
        if pkg.installed and pkg.name in PACKAGE_LIST:
            yield pkg.name

我现在正在将该脚本扩展到一个项目中,最终目的是使其可以在PyPI上和/或作为Debian软件包本身使用。

我使用virtualenvs隔离我的Python开发环境。我需要在virtualenv中添加什么软件包名称(或路径),以便可以在该环境中调用import apt

到目前为止,我已经尝试过:

解决方法

您可以通过以下方式使用pipenv实现此目的(类似的说明也适用于其他venv管理器):

pipenv --site-packages  # see note 1
PIP_IGNORE_INSTALLED=1 pipenv install  # see note 2

您更有可能将其运行为:

pipenv --site-packages
PIP_IGNORE_INSTALLED=1 pipenv install -e . --dev
# treats codebase as a package,also installs dev dependencies

注意1::我们必须访问系统程序包(也称为网站程序包),以便可以import apt

注意2: ...但是我们更喜欢virtualenv软件包而不是系统软件包。看到 https://pipenv.pypa.io/en/latest/advanced/#working-with-platform-provided-python-components了解详情。

评论:

  • 这意味着您的venv中也可以使用未在Pipfile中定义的所有 other 系统软件包。您必须记住,使用相同代码库的其他开发人员不一定可以使用它们。如果您有基本的CI环境,它应该可以解决此问题。

  • 此方法适用于vext不支持的其他软件包。