如何使用 Poetry 从现有项目导入 requirements.txt

How to import requirements.txt from an existing project using Poetry

我正在现有项目中尝试 Poetry。它最初使用了 pyenv 和虚拟环境,所以我有一个包含项目依赖项的 requirements.txt 文件。

我想使用 Poetry 导入 requirements.txt 文件,以便我可以第一次加载依赖项。我查看了 poetry 的文档,但还没有找到执行此操作的方法。你能帮帮我吗?

我知道我可以手动添加所有包,但我希望有一个更自动化的过程,因为有很多包...

poetry 不直接支持这个。但是如果你有一个手工制作的所需包列表(最好没有任何版本号),它只包含主要依赖项而不包含依赖项的依赖项,你可以这样做:

$ cat requirements.txt | xargs poetry add

我找到的最好的方法是这个:

$ for item in $(cat requirements.txt); do poetry add "${item}"; done

一个班轮:

cat requirements.txt | grep -E '^[^# ]' | cut -d= -f1 | xargs -n 1 echo poetry add

我没有足够的声誉来发表评论,但对 的答案的改进是省略回声并调用诗歌本身。

cat requirements.txt | grep -E '^[^# ]' | cut -d= -f1 | xargs -n 1 poetry add

在我的例子中,这成功地将包添加到 pyproject.toml 文件。

作为参考,这是我的 requirements.txt 文件的片段:

pytz==2020.1  # https://github.com/stub42/pytz
python-slugify==4.0.1  # https://github.com/un33k/python-slugify
Pillow==7.2.0  # https://github.com/python-pillow/Pillow

并且在调用cat requirements.txt | grep -E '^[^# ]' | cut -d= -f1时(注意为了演示省略了xargs -n 1 poetry add)会输出如下:

pytz
python-slugify
Pillow
# NOTE: this will install the latest package - you may or may not want this.

添加开发依赖与添加 -D--dev 参数一样简单。

# dev dependancies example
cat requirements-dev.txt | grep -E '^[^# ]' | cut -d= -f1 | xargs -n 1 poetry add -D

最后,如果您的开发需求是从父需求文件安装的,例如:

-r base.txt

package1
package2

然后这将在 poetry 运行时产生错误,但是,它将继续通过 -r base.txt 行并按预期安装包。

在 Linux manjaro 上测试并按照说明安装了诗歌 here

我很感激这可能有点晚,但你可以使用

poetry add $( cat requirements.txt )

只需使用普通 requirements.txt 并使用 awk 过滤掉版本号:

awk -F '==' '{print }' requirements.txt | xargs -n1 poetry add

-F 指定过滤器或拆分点。 $1 是拆分中的第一个参数。输入文件作为最后一个参数。之后,您可以使用 xargs -n 1 将其通过管道传输到 poetry add 以连续调用每一行的 poetry add 而不是一次使用 space 分隔的字符串。如果您想一次使用所有条目,只需省略 -n 1。还要确保诗歌环境已经存在。

只消耗 requirements.txt 省略过滤器并使用

awk '{print }' requirements.txt | xargs -n1 poetry add

但是 cat 等其他工具也适用于这种情况。

这与诗歌相反

poetry export -f requirements.txt --without-hashes > requirements.txt

对于 Powershell:

$reqs = @(cat requirements.txt)
for($i = 0; $i -lt $reqs.length; $i++){poetry add $reqs[i]}

请注意,这不会忽略需求文件中的注释或任何其他内容。这严格地将其视为原始文本,因此它希望每一行都是一个包。

我发现这些答案中的 none 个就足够了,所以我创建了一个自己的答案:

https://github.com/src-r-r/python-stanza

这是一个新宝贝,所以欢迎投稿,但到目前为止它非常适合千篇一律:

  • 自动检测 setup.py 并获取项目信息
  • 允许为开发依赖项或普通依赖项指定多个 requirements.txt 文件
  • 允许覆盖名称和版本。
  • 如果包含在需求文件中,也会添加引用的需求(例如 -r ./special-requirements.txt)。

如果您的需求文件中有 # 条评论(在行首或行尾),下面是一个有效的方法:

poetry add $(sed -e 's/#.*//' -e '/^$/ d' < requirements.txt)

https://www.grymoire.com/Unix/Sed.html#uh-30

我做了一个工具poetry-add-requirements.txt just for this. Code

使用 pipx install poetry-add-requirements.txt

安装

然后 运行 poeareq.

用法

运行 poetry-add-requirements.txt,可选择指定您的 requirements.txt 文件和 --dev 开发依赖项。

poeareqpoetry-add-requirements.txt 的别名。

$ poeareq --help

usage: poeareq [-h] [-D] [requirements.txt files ...]

Add dependencies specified in requirements.txt to your Poetry project

positional arguments:
  requirements.txt file(s)
                        Path(s) to your requirements.txt file(s) (default: requirements.txt)

options:
  -h, --help            show this help message and exit
  -D, --dev             Add to development dependencies (default: False)

特点

  • 自动检测 requirements.txt 个文件的字符集并将规范化依赖规范提供给 poetry
  • 遇到第一个 poetry add 错误时停止。