Poetry中使用相对路径进行pip安装

3

如何在 poetrypyproject.toml 中指定 pip 可以使用的相对路径?

poetry 成功安装它们,但是 pip 失败,并显示以下错误:

File "/tmp/pip-build-env-ck09aiax/overlay/lib/python3.7/site-packages/poetry/core/packages/directory_dependency.py", line 36, in __init__
        raise ValueError("Directory {} does not exist".format(self._path))
    ValueError: Directory ../lib_foo does not exist

示例

我有以下的仓库结构

.
├── lib_foo
│   ├── lib_foo
│   │   └── __init__.py
│   └── pyproject.toml
└── main_app
    ├── main_app
    │   └── __init__.py
    └── pyproject.toml

main_app 依赖于 lib_foo,其依赖关系如下:
./main_app/pyproject.toml

[tool.poetry.dependencies]
python = "^3.7"
lib-foo = { path = "../lib_foo" }  # also tried  path = "../lib_foo/"

执行以下操作时:

./main_app$ poetry install  # runs successfully 
./main_app$ python -m pip install ../lib_foo/  # runs successfully
./main_app$ python -m pip install .  # fails with the error mentioned above 
./main_app$ python -m pip --version
pip 20.1.1 from ./main_app/my_venv/lib/python3.7/site-packages/pip (python 3.7)


我在开发项目时使用 poetry,但是在部署时只想使用 pip


相关的问题


据我所记,这是不被支持的。问题在于,在Python分发(_sdist_或_wheel_)中编写路径有些不稳定,尤其是相对路径。我会尝试找到一些具体的证据,我想我不久前看到过它。 - sinoroc
@sinoroc 看起来有一个 PR 可能可以解决这个问题? - moshevi
我不认为这与此有关,但我可能是错的。 - sinoroc
我看到你已经在这里提出了问题并得到了答案:https://github.com/pypa/pip/issues/9127 -- 那么为什么你没有将这个链接添加到问题中呢? - sinoroc
@sinoroc 将编辑 - moshevi
1个回答

3
我非常确定pip不能处理具有相对路径的依赖项。绝对路径可能可以接受。 我认为,pip核心元数据格式获取依赖项,因此对于依赖项的格式是PEP 508,其中指出:

URL引用表单在PEP-440 [4]中指定,实际上并未在pip中实现,但由于PEP-440被接受,我们使用该格式,而不是pip当前本地格式。

PEP 440则表示(重点在于):

文件URL采用file://<host>/<path>的形式。如果省略了<host>,则假定为 localhost ,即使省略了<host>第三个斜杠仍必须存在

所以我天真地解释为所有路径都必须是绝对路径。
相关:

pip可以处理相对路径的依赖关系,但似乎存在一些不一致性 - moshevi
看起来他们同意我的观点:https://github.com/pypa/pip/issues/9127#issuecomment-726215622 - sinoroc
似乎是,我猜这可能有点反模式? - moshevi
我不知道...有些事情可能是可以做到的,但人们不应该去做,他们还是去做了,然后抱怨它不起作用。--对于pyproject.toml中的_poetry_来说,允许这样做是可以的,但不应该允许将其写入分发元数据,因为这根本是不被允许的。--我认为这已经在_poetry_的问题单中讨论过了。--据我所知,_PyPI_会直接拒绝上传此类具有相对和绝对路径依赖项的分发包。 - sinoroc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接