开发二进制模块时避免重新安装包

问题描述 投票:0回答:1

我正在开发一个包含编译代码的 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 setuptools python-packaging scikit-build
1个回答
0
投票

pip
看到
pyproject.toml
文件时,它会自动启用“构建隔离”功能[^1]。

这意味着

pip
将创建一个“一次性虚拟环境”,仅用于构建您的项目,并在构建完成后删除此环境[^2]。

这就是为什么总是重新安装构建依赖项的原因。

为避免这种情况,您可以使用以下步骤执行安装:

  1. 在您想要安装软件包的同一环境中手动安装构建依赖项(最好在此处使用虚拟环境)。
    • 在您的示例中,这意味着运行:
      pip install ninja cmake>=3.20 scikit-build>=0.13
      pip install -U setuptools wheel  # It is good to use the latest version...
      
  2. 安装项目时显式禁用构建隔离:
    pip install --no-build-isolation .
    
    • 请注意,使用
      --no-build-isolation
      pip
      时不会自动安装任何构建依赖项。这就是为什么我们需要步骤 1。
    • 这也是您需要安装
      wheel
      的原因(setuptools 会自动将
      wheel
      添加到您在
      build-system.requires
      中指定的任何内容)。

[^1]:最终,未来版本的

pip
将默认启用“构建隔离”,即使您没有
pyproject.toml

[^2]:从广义上讲,这种行为背后的原因是为了避免依赖地狱和版本冲突。

© www.soinside.com 2019 - 2024. All rights reserved.