【问题标题】:getting no develop install with `pip install -e .` unless I delete `pyproject.toml`除非我删除 `pyproject.toml`,否则无法使用`pip install -e`进行开发安装
【发布时间】:2022-08-19 02:32:49
【问题描述】:

我有以下pip install -e . 的情况不是构建develop 版本,除非我删除不包含包装信息的pyproject.toml,而是black 配置。

有人知道该怎么做才能获得develop 构建。

我的pyproject.toml 看起来像这样:

# Source https://github.com/psf/black#configuration-format
[tool.black]
line-length = 100
target-version = [\'py38\']
exclude = \'\'\'

\'\'\'

setup.py

from setuptools import find_namespace_packages
from setuptools import setup

setup(
    name=\"webservice\",
    packages=find_packages(),
    version=\"0.1.0\",
    description=\"description\",
    author=\"Author\",
    license=\"License\",
)

使用这两个文件运行pip install -e ....

(webservice_tool)pk@LAP1:~/webservice_tool$ pip install -e .
Obtaining file:///home/pk/webservice_tool
  Installing build dependencies ... done
  Checking if build backend supports build_editable ... done
  Getting requirements to build editable ... done
  Preparing editable metadata (pyproject.toml) ... done
Building wheels for collected packages: webservice
  Building editable for webservice (pyproject.toml) ... done
  Created wheel for webservice: filename=webservice-0.1.0-0.editable-py3-none-any.whl size=4070 sha256=dcb7c034ba437503d1059fe9370ccafbda144cd19f3e5d92340a63a7da396422
  Stored in directory: /tmp/pip-ephem-wheel-cache-6iqiqbob/wheels/e6/b5/ba/40d8c3d66df94ee2ae46e181034e0c3c47132784db53284d0b
Successfully built webservice
Installing collected packages: webservice
Successfully installed webservice-0.1.0

我删除了pyproject.toml,然后才出现Running setup.py develop

(webservice_tool) pk@LAP1:~/webservice_tool$ pip install -e .
Obtaining file:///home/pk/webservice_tool
  Preparing metadata (setup.py) ... done
Installing collected packages: webservice
  Attempting uninstall: webservice
    Found existing installation: webservice 0.1.0
    Uninstalling webservice-0.1.0:
      Successfully uninstalled webservice-0.1.0
  Running setup.py develop for webservice
Successfully installed webservice-0.1.0

我的 conda env 中一些选定软件包的版本,在 wsl2 中运行

packaging                 21.3               pyhd3eb1b0_0  
pip                       22.1.2           py38h06a4308_0  
python                    3.8.13               h12debd9_0  
setuptools                61.2.0           py38h06a4308_0  

文件夹结构

|-- data_utils
|   |-- clean_cache.py
|   `-- advanced_utils.py
|-- deployment
|   |-- base_deployment
|   |   |-- auth-proxy.yaml
|   |   |-- kustomization.yaml
|   |   |-- webapi.yaml
|   |   `-- webui.yaml
|   `-- mysql_from_helm
|       |-- mysql-from-helm.yaml
|       `-- mysql-kustomization.yaml
|-- docker-compose.yml
|-- Dockerfile
|-- environment.yml
|-- live_api
|   |-- definitions.json
|   |-- __init__.py
|   `-- live_api.py
|-- params.py
|-- pyproject.toml
|-- setup.py
|-- shared_helpers
|   |-- data_cleaning.py
|   |-- handle_time.py
|   |-- __init__.py
|   |-- plot_timesequence.py
|   |-- read_samples.py
|   `-- save_samples.py
|-- setup.py
|-- util.py
|-- webtool
|   |-- clean_data
|   |   |-- clean_data.py
|   |   `-- __init__.py
|   |-- evaluation
|   |   |-- draw_figures.py
|   |   |-- __init__.py
|   |   `-- webtool_metrics.py
|   |-- __init__.py
|   |-- preprocess
|   |   |-- __init__.py
|   |   `-- preprocess.py
|   |-- ui
|   |   |-- __init__.py
|   |   `-- create_ui.py
|   `-- util
|       |-- data_input.py
|       |-- data_redefinitions.py
|       `-- __init__.py
|-- webtool.egg-info
|   |-- dependency_links.txt
|   |-- entry_points.txt
|   |-- PKG-INFO
|   |-- SOURCES.txt
|   `-- top_level.txt
`-- webtool_tests
    |-- clean_data
    |   `-- test_clean_data.py
    |-- evaluation
    |   `-- test_draw_figures.py
    |-- preprocess
    |   `-- test_preprocess.py
    `-- util
        |-- test_data_input.py
        `-- test_data_redefinitions.py
  • 它做同样的事情,只是输出消息不同。
  • 是什么让您认为这不是开发安装?
  • 这两条消息的含义相同:Building editable for webservice (pyproject.toml) ... done 在一个中,Running setup.py develop for webservice 在另一个中。
  • 可编辑是关键词。
  • @wim 这两个安装在处理导入方面的行为不同。如果我在主项目文件夹home/pk/webservice_tool 中有一个文件util.py,我可以在python 脚本中编写import util,对于Running setup.py develop 版本,这是可行的,而另一个则抛出错误ModuleNotFoundError: No module named \'util\'

标签: python pip setuptools setup.py pyproject.toml


【解决方案1】:

这些是两个都开发安装。此处 pip 输出的不同之处在于,pyproject.toml 文件的存在(或不存在)导致 pip 使用(或不使用)构建后端挂钩。从 PEP 517:

如果pyproject.toml 文件不存在……源代码树未使用此规范,工具应恢复为运行 setup.py 的传统行为

您还可以使用 pip 命令行选项来控制它:

$ pip install --help | grep pep
  --use-pep517                Use PEP 517 for building source distributions
                              (use --no-use-pep517 to force legacy behaviour).

不同之处在于,对于 PEP 517 风格的构建,pip 正在设置一个 venv 并全新安装 setuptools 以在幕后构建包(请参阅“安装构建依赖项......完成”在日志中),而不是直接调用python setup.py develop,它只是假设在您用来执行setup.py的Python运行时中已经安装了适当的setuptools版本。这里的要点是,使用 PEP 517 风格的构建系统允许项目指定它需要的 setuptools 版本(或者,实际上,完全使用其他构建系统)。

最终结果将是相同的 - 放置在 site-packages 中的 .pth path configuration file 会将源目录公开为开发安装。

由于util.py 不包含在任何包中,因此要在开发安装中获取它(而不是仅从当前工作目录导入),您还需要在@987654330 中将它与find_packages() 一起列出@ 称呼:

# in setup.py 
from setuptools import setup

setup(
    name="webservice",
    version="0.1.0",
    packages=find_packages(),
    py_modules=["util"],  # <--- here
    ...
)

【讨论】:

    【解决方案2】:

    正如其他人已经说过的,这两个安装都是可编辑的。导入行为的差异可能是由在后台执行可编辑安装的方式引起的:

    • 在旧模式下,您的项目目录只需添加到 sys.path
      (这就是import util 起作用的原因)
    • 在 PEP 660 模式下 setuptools may choose a different technique 基于配置选项和您的项目结构(支持 since version 64.0.0):

      setuptools 力求在允许用户查看正在编辑的项目文件的效果与仍试图保持可编辑安装尽可能类似于常规安装之间找到平衡。


    笔记:你不应该在你的包中做import util,因为当它定期安装时这将不起作用!请改用import webservice.utilfrom . import util

    【讨论】:

    • 用户拥有 setuptools v61.2.0,因此 64.x 中的新内容与此处无关。我猜为什么import util 起作用是因为它是 cwd 和空字符串“”在 sys.path 中,但我们会看到......(我已经要求 OP 包含目录结构)
    • @wim 是的,但是正如您在回答中所说:使用 PEP 517 样式构建,pip 正在设置一个 venv 并新安装 setuptools 以用于包构建,即最新版本。 ;-) 根据日志,这就是找到 build_editable 挂钩的原因。
    • 啊,是的,好点子!
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2021-06-15
    • 2019-10-14
    • 2016-04-29
    • 1970-01-01
    • 2021-09-21
    • 2015-04-28
    • 2019-09-13
    相关资源
    最近更新 更多