我正在开发一个包含编译代码的 Python 模块。当使用包含
pip install .
和 pyproject.toml
的目录中的 setup.py
时,编译和安装模块是有效的(我实际上不确定我需要这些文件的哪种组合,但至少当两者都存在时它才有效)。
我遇到的问题是,每次运行
pip install .
时,pip
都会重新安装 cmake 和朋友:
从输出:
Successfully installed cmake-3.28.3 distro-1.9.0 ninja-1.11.1.1 packaging-23.2 scikit-build-0.17.6 setuptools-69.1.1 wheel-0.42.0
这会导致每次我迭代源代码中的更改时,我都必须重新安装,每次都需要几秒钟。
有没有办法安装仅我的模块而不安装任何依赖项?我已经尝试了
pip install --no-deps .
和pip install --no-dependencies .
,但没有成功。
pyproject.toml
的内容:
[build-system]
requires = [
'setuptools>=42',
'scikit-build>=0.13',
'cmake>=3.20',
'ninja'
]
build-backend = 'setuptools.build_meta'
setup.py
只有包名、许可证等
当
pip
看到pyproject.toml
文件时,它会自动启用“构建隔离”功能[^1]。
这意味着
pip
将创建一个“一次性虚拟环境”,仅用于构建您的项目,并在构建完成后删除此环境[^2]。
这就是为什么总是重新安装构建依赖项的原因。
为避免这种情况,您可以使用以下步骤执行安装:
pip install ninja cmake>=3.20 scikit-build>=0.13
pip install -U setuptools wheel # It is good to use the latest version...
pip install --no-build-isolation .
--no-build-isolation
pip
时不会自动安装任何构建依赖项。这就是为什么我们需要步骤 1。wheel
的原因(setuptools 会自动将 wheel
添加到您在 build-system.requires
中指定的任何内容)。[^1]:最终,未来版本的
pip
将默认启用“构建隔离”,即使您没有 pyproject.toml
。
[^2]:从广义上讲,这种行为背后的原因是为了避免依赖地狱和版本冲突。