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

Question:

I am trying out Poetry in an existing project. It used pyenv and virtual env originally so I have a requirements.txt file with the project’s dependencies.

I want to import the requirements.txt file using Poetry, so that I can load the dependencies for the first time. I’ve looked through poetry’s documentation, but I haven’t found a way to do this. Could you help me?

I know that I can add all packages manually, but I was hoping for a more automated process, because there are a lot of packages…

Asked By: Felipe

||

Answers:

poetry doesn’t support this directly. But if you have a handmade list of required packages (at best without any version numbers), that only contain the main dependencies and not the dependencies of a dependency you could do this:

$ cat requirements.txt | xargs poetry add
Answered By: finswimmer

The best method I’ve found is this one:

$ for item in $(cat requirements.txt); do poetry add "${item}"; done
Answered By: L.Silva

One liner:

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

Answered By: Liang Yun Gong

I don’t have enough reputation to comment but an enhancement to @Liang‘s answer is to omit the echo and call poetry itself.

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

In my case, this successfully added packages to the pyproject.toml file.

For reference this is a snippet of my requirements.txt file:

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

and when calling cat requirements.txt | grep -E '^[^# ]' | cut -d= -f1 (note the omission of xargs -n 1 poetry add for demonstration) it will output the following:

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

Adding dev dependencies is as simple as adding the -D or --dev argument.

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

Lastly, if your dev requirements install from a parent requirements file, for example:

-r base.txt

package1
package2

Then this will generate errors when poetry runs, however, it will continue past the -r base.txt line and install the packages as expected.

Tested on Linux manjaro with poetry installed as instructed here.

Answered By: Daniel Michaels

I appreciate this might be a bit late but you can just use

poetry add $( cat requirements.txt )
Answered By: James Rocker

Just use the plain requirements.txt and filter out version numbers with awk:

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

-F specifies a filter or split point. $1 is the first argument in the split. The input file comes as last argument. Afterwards you can pipe it to poetry add using xargs -n 1 to call poetry add with each line consecutively and not with a space separated string at once. If you want to consume all entries at once just ommit -n 1. Also make sure that a poetry environment is already present.

To just consume the requirements.txt omit the filter and use

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

But other tools like cat are fine for that case as well.

Answered By: Smittie

For Powershell:

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

Note this won’t ignore comments or anything else in the requirements file. This is strictly taking it as raw text so it expects every line to be a package.

Answered By: Jamalan

I found none of these answers sufficed so I created one of my own:

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

It’s a new baby, so contributions welcome, but so far it’s very cookiecutter-friendly:

  • automatically detects a setup.py and fetches project info
  • allows multiple requirements.txt files to be specified for either dev dependencies or normal dependencies
  • allows the name and version to be overwritten.
  • also adds referenced requirements (e.g. -r ./special-requirements.txt) if it’s included in a requirements file.
Answered By: Dash2TheDot

Here’s one that works if you have # comments (at the start of a line or at the end of a line) in your requirements file:

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

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

Answered By: Hyperplane

I made a tool poetry-add-requirements.txt just for this. Code

Install it with pipx install poetry-add-requirements.txt,

then run poeareq.

Usage

Run poetry-add-requirements.txt, optionally specify your requirements.txt files and --dev for dev dependencies.

poeareq is provided is an alias to poetry-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)

Features

  • Auto detect charset of requirements.txt file(s) and feed normalized dependency specs to poetry.
  • Stop on first poetry add error.
Answered By: Teddy C

A one-liner for Windows PowerShell users:

    @(cat requirements.txt) | %{&poetry add $_}

For more about piping arguments with PowerShell see this useful answer.

Answered By: Aelius

Had this issue when moving from a requirement.txt file to using Poetry.

If you want to run the command in windows using cmd you can run it as a .bat file:

for /f "tokens=*" %%i in (requirements.txt) do (
    poetry add %%i
)
Answered By: m_h

For Windows’ users

In Windows, the xargs command, which is commonly used in Unix-like systems, is not a standard command. However, you can use an alternative approach to achieve a similar result using the PowerShell commandlet.

Use this Get-Content requirements.txt | ForEach-Object { poetry add $_ }

This command reads the content of the requirements.txt file using Get-Content and then passes each line to poetry add using ForEach-Object. Each line from the requirements.txt file is passed as an argument to poetry add, and the dependencies are added to your project using Poetry.

You must be in the root directory of your project

Answered By: Sergey
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.