You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无网络环境下打包Python项目为软件包

解决离线环境下Python build工具找不到wheel的问题

我懂你遇到的这个坑——python -m build默认会创建一个完全隔离的虚拟环境,哪怕你当前venv里已经装了setuptools和wheel,它也会无视这些,尝试从PyPI重新下载依赖,离线状态下自然就失败了。下面给你几个靠谱的解决办法:

方法1:禁用隔离环境(最快捷)

如果你的当前虚拟环境已经满足setuptools>=42wheel的版本要求,直接给build加上--no-isolation参数,让它复用当前环境的打包工具,不用创建新的隔离环境:

python -m build --no-isolation

这个方法最简单,离线状态下直接就能跑,前提是你当前环境已经装对了依赖。

方法2:用本地缓存/离线依赖包保持隔离环境(适合需要干净打包环境的场景)

如果你还是想保留隔离环境(比如确保打包环境和生产环境一致),可以提前把依赖下载到本地,让build的隔离环境从本地读取:

步骤1:联网时预下载依赖包

先在联网状态下,用pip download把需要的依赖包下载到本地目录(比如./offline-deps):

pip download --dest ./offline-deps setuptools>=42 wheel

执行完后,./offline-deps目录里会出现这两个包的wheel文件。

步骤2:离线时指定本地依赖源

离线打包时,通过环境变量告诉build使用本地的依赖目录:

PIP_FIND_LINKS=./offline-deps python -m build

这样build创建的隔离环境会直接从./offline-deps里找setuptools和wheel,完全不用联网。

如果你之前已经通过pip安装过这些依赖,pip的默认缓存目录(~/.cache/pip)里已经有这些包的话,也可以试试让pip只从缓存读取,不用访问PyPI:

PIP_NO_INDEX=true python -m build

不过这个方法依赖pip缓存的完整性,如果你缓存里的版本不符合setuptools>=42的要求,还是会失败,所以更推荐手动下载到本地目录的方式。

为什么提前安装还是没用?

再补充一句:python -m build的隔离环境是完全独立的,它不会继承你当前虚拟环境里的任何包,哪怕你当前环境装了wheel,隔离环境里还是空的,所以离线时会触发下载失败——这就是核心原因。

内容的提问来源于stack exchange,提问作者stefano

火山引擎 最新活动