Как импортировать файл requirements.txt из существующего проекта с помощью Poetry

Я пытаюсь использовать Poetry в существующем проекте. Первоначально он использовал pyenv и виртуальную среду, поэтому у меня есть файл requirements.txt с зависимостями проекта.

Я хочу импортировать файл requirements.txt с помощью Poetry, чтобы я мог загрузить зависимости в первый раз. Я просмотрел документацию по поэзии, но не нашел способа сделать это. Не могли бы вы помочь мне?

Я знаю, что могу добавить все пакеты вручную, но я надеялся на более автоматизированный процесс, потому что пакетов много...


person Felipe    schedule 06.07.2020    source источник
comment
Вы пробовали pip freeze > requirements.txt в командной строке?   -  person Ahx    schedule 06.07.2020
comment
Да, у меня есть файл requirements.txt. Я хотел бы импортировать его в Poetry без необходимости вводить пакеты вручную.   -  person Felipe    schedule 06.07.2020
comment
вы создали его, заморозив всю среду, или вы поддерживали его вручную? обратите внимание, что существует большая разница между абстрактными и конкретными требованиями проекта. . поэзия сгенерирует последний автоматически в виде файла поэзии.lock, но список абстрактных требований необходим и должен поддерживаться вручную. И его определенно нельзя извлечь из результата pip freeze.   -  person Arne    schedule 07.07.2020
comment
Он поддерживается вручную. Это абстрактное требование, поскольку в нем перечислены только пакеты более высокого уровня.   -  person Felipe    schedule 07.07.2020
comment
это хорошо. проекты редко будут иметь больше, чем несколько абстрактных зависимостей, поэтому я предположил, что это может быть конкретный список. Но да, в поэзии нет команды для импорта requirements.txt. Вы можете использовать dephell, но я не знаю, насколько это хорошо или надежно. является. Честно говоря, я всегда выполнял портирование зависимостей вручную, поскольку это одна из частей приложения, которая может привести к серьезным проблемам и техническому долгу, если о ней не заботятся как можно лучше.   -  person Arne    schedule 07.07.2020


Ответы (8)


poetry не поддерживает это напрямую. Но если у вас есть составленный вручную список необходимых пакетов (в лучшем случае без номеров версий), который содержит только основные зависимости, а не зависимости зависимости, вы можете сделать это:

$ cat requirements.txt|xargs poetry add
person finswimmer    schedule 08.07.2020

У меня недостаточно репутации, чтобы комментировать, но улучшение ответа @Liang состоит в том, чтобы опустить эхо и вызвать поэзию сам.

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.

Добавить зависимости dev так же просто, как добавить аргумент -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

Затем это будет генерировать ошибки при запуске поэзии, однако она продолжится после строки -r base.txt и установит пакеты, как и ожидалось.

Протестировано на Linux manjaro с установленной поэзией, как указано здесь.

person Daniel Michaels    schedule 04.11.2020

Я понимаю, что это может быть немного поздно, но вы можете просто использовать

poetry add `cat requirements.txt`
person James Rocker    schedule 11.11.2020
comment
Добро пожаловать в StackOverflow. Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество. вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Попробуйте отредактировать свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Ruli; 11.11.2020
comment
@Ruli это полный ответ. Это ясно и не нуждается в дополнительных пояснениях, и это просто работает. Это лучший ответ здесь. - person naught101; 18.06.2021
comment
также poetry add $(cat requirements.txt) лучше работает для тех, кто ненавидит обратные кавычки :-D - person edomaur; 08.08.2021

Просто используйте простой файл requirements.txt и отфильтруйте номера версий с помощью awk:

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

-F указывает фильтр или точку разделения. $1 — первый аргумент в разделении. Входной файл является последним аргументом. После этого вы можете направить его в poetry add, используя xargs -n 1 для вызова poetry add с каждой строкой последовательно, а не сразу со строкой, разделенной пробелом. Если вы хотите использовать все записи сразу, просто опустите -n 1. Также убедитесь, что поэтическая среда уже присутствует.

Чтобы просто использовать файл requirements.txt, не используйте фильтр и используйте

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

Но другие инструменты, такие как cat, также подходят для этого случая.

person Smittie    schedule 23.11.2020

Лучший метод, который я нашел, это один:

$ for item in $(cat requirements.txt); do poetry add "${item}"; done
person L.Silva    schedule 23.07.2020

Один лайнер:

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

person Liang Yun Gong    schedule 01.08.2020

Для PowerShell:

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

Обратите внимание, что это не будет игнорировать комментарии или что-либо еще в файле требований. Это строго воспринимает его как необработанный текст, поэтому он ожидает, что каждая строка будет пакетом.

person Jamalan    schedule 17.06.2021

Это наоборот от поэзии

poetry export -f requirements.txt --without-hashes > requirements.txt
person czw    schedule 02.02.2021