如何在无互联网连接环境下正常运行tox?
问题根因
报错核心是isolated_build = True开启了PEP 517隔离构建机制:tox打包本地项目时会单独创建临时构建环境,默认通过pip从公网PyPI拉取构建后端依赖(日志中拉取失败的flit-core,以及setuptools、wheel等均属于这类依赖)。
之前添加的VIRTUALENV_DOWNLOAD=0配置仅对tox创建测试虚拟环境的步骤生效,完全无法约束PEP 517构建阶段的pip拉取行为,因此配置后依然报错。
无网环境可行方案
根据实际场景选以下任意一种即可:
- 方案1:关闭隔离构建(配置成本最低)
将tox.ini中isolated_build = True修改为isolated_build = False。配置后tox安装本地项目时不会创建临时隔离构建环境,会直接复用测试虚拟环境内已预装的构建工具完成打包,不会触发构建阶段的联网拉取动作。
注意:需要提前在tox使用的基础Python环境中装好项目对应版本的构建依赖(flit/setuptools/wheel等),否则会触发找不到构建后端的错误。 - 方案2:保留隔离构建,强制pip使用本地离线依赖源
如果需要保留隔离构建特性,提前在有网环境将所有依赖(包括构建阶段需要的flit-core/setuptools/wheel,以及testenv中声明的mypy/pytest/types-appdirs等测试依赖)全部下载为wheel包存放到本地目录(例如./local_wheels),之后修改tox.ini配置,强制所有pip进程(含构建阶段的子pip进程)仅从本地目录取包、完全禁用公网索引:[tox] envlist = py3 isolated_build = True [testenv] setenv = PIP_NO_INDEX = True PIP_FIND_LINKS = ./local_wheels PIP_DISABLE_PIP_VERSION_CHECK = 1 VIRTUALENV_DOWNLOAD = 0 deps = mypy pytest types-appdirs commands = mypy src/mypackage tests pytest - 方案3:提前预构建项目包,跳过tox构建流程
在有网环境提前执行构建命令生成本地项目的安装包:
构建完成后# 提前安装build工具:pip install build python -m builddist目录下会生成项目的tar.gz源码包和whl二进制包,无网环境运行tox时直接指定预构建的包安装即可:
这种方式会完全跳过tox的本地项目构建步骤,不会触发构建阶段的依赖拉取,仅需保证测试依赖可从本地源获取即可。tox --installpkg dist/mypackage-0.1.1.dev0-py3-none-any.whl
补充说明:pip 20.3.4已经完整支持
PIP_NO_INDEX和PIP_FIND_LINKS环境变量,配置后会全局生效到所有pip子进程,包括PEP517创建的隔离构建环境内的pip进程,不需要额外升级版本。
内容的提问来源于stack exchange,提问作者jakun
相关产品推荐
相关产品推荐

