Автоматически создавать требования. Текст
Иногда я загружаю исходный код Python из github и не знаю, как установить все зависимости. Если нет файла require.txt, я должен создать его вручную. Вопрос в том, что при наличии директории с исходным кодом на python можно ли автоматически создавать файл require.txt из раздела импорта?
30 ответов
Вы можете использовать следующий код для создания файла require.txt:
pip install pipreqs
pipreqs /path/to/project
больше информации, связанной с pipreqs можно найти здесь.
Иногда вы сталкиваетесь pip freeze
, но это сохраняет все пакеты в среде, включая те, которые вы не используете в своем текущем проекте.
Для python3: (у меня на компьютере есть как python 2, так и 3, где по умолчанию используется python2)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
Удивительно, насколько сложна эта простая задача в Python. Вот что я считаю лучшим способом сделать это автоматически.
Вам понадобятся два инструмента:
1.pipreqs
pipreqs просмотрит ваш проект и установит только те пакеты, которые использует ваш проект. Вместо всех пакетов в вашей среде Python как
pip freeze
сделал бы.
Но у этого подхода есть проблема. Подпакеты не устанавливаются.
Например, ваш проект использует.
pandas
сам использует
numpy==1.21.2
среди других пакетов. Но сам не записывает подпакеты (т.е. numpy) в
requirments.txt
Здесь вам нужно совместить со вторым инструментом.
примет пакеты и сгенерирует их со всеми подпакетами. Например, если у вас есть
pandas==1.3.2
в ,
pip-tools
будет генерировать
numpy==1.21.2 # via pandas
в .
Но вам нужно вручную добавить пакет в. Это может привести к ошибке, и вы можете время от времени забыть сделать это.
Здесь вы можете использовать первый инструмент.
Но оба инструмента пишут в. Так как же это исправить?
Использовать
--savepath
для
pipreqs
писать в
requirements.in
вместо значения по умолчанию.
Сделать это одной командой; просто делать
Вот и все. Теперь вам не нужно беспокоиться о ручном обслуживании пакетов, и у вас будут все подпакеты, так что ваша сборка будет детерминированной.
TL;DR
-
pip3 install pipreqs
-
pip install pip-tool
Используйте следующее, чтобы построить детерминированный
requirements.txt
pipreqs --savepath=requirements.in & pip-compile
В моем случае я использую Anaconda, поэтому выполнение следующей команды из терминала conda в моей среде решило ее и автоматически создало для меня этот текстовый файл требований:
conda list -e > requirements.txt
Это было взято из этой ссылки Github pratos/condaenv.txt
Я слепо следовал принятому ответу об использовании pip3 freeze> requirements.txt
Он сгенерировал огромный файл, в котором перечислены все зависимости всего решения, чего я не хотел.
Итак, вам нужно выяснить, какого типа файл requirements.txt вы пытаетесь создать.
Если вам нужен файл requirements.txt, в котором есть ВСЕ зависимости , используйте pip3
pip3 freeze > requirements.txt
Однако, если вы хотите создать минимальный файл requirements.txt, в котором перечислены только необходимые вам зависимости , используйте пакет pipreqs. Это особенно полезно, если у вас есть множество файлов requirements.txt на уровне каждого компонента в проекте, а не один файл на уровне всего решения.
pip install pipreqs
pipreqs [path to folder]
e.g. pipreqs .
Поскольку большинство ответов с использованием не сработало для меня. Вот мой ответ.
Чтобы сгенерировать файл requirements.txt:
pip install pipreqs
python -m pipreqs.pipreqs --encoding utf-8 /path/to/project
Я предпочитаю использовать больше чем , так какpip freeze
сохраняет все пакеты в среде, включая те, которые вы не используете в своем текущем проекте. Однако,pipreqs
сохраняйте только те, которые вы используете в своем проекте.
Для установки требований используйте:
pip3 install -r requirements.txt
Чтобы создать список необходимых модулей Python, напишите этот код в своем терминале:
pip3 freeze > requirements.txt
Во-первых, ваш файл проекта должен быть файлом py, который является прямым файлом python. Если ваш файл имеет формат ipynb, вы можете преобразовать его в тип py, используя следующую строку кода:
jupyter nbconvert --to=python
Затем вам нужно установить библиотеку pipreqs из cmd (терминал для Mac).
pip install pipreqs
Теперь мы можем создать текстовый файл, используя приведенный ниже код. Если вы находитесь на том же пути, что и ваш файл, вы можете просто написать ./. В противном случае вам нужно указать путь к вашему файлу.
pipreqs ./
или же
pipreqs /home/project/location
В результате для вашего проекта будет создан файл requirements.txt.
Вы можете просто сделать это с помощью команды. он создаст файл require.txt и автоматически добавит соответствующие модули.
For Unix : pip3 freeze > requirements.txt
For Windos: pip freeze > requirements.txt
СОЗДАЙТЕ требование.txt:
Для версии Python 3 команда:
pip3 freeze > requirements.txt
Для версии Python 2 команда:
pip freeze > requirements.txt
Установите требования.txt:
Для версии Python 3 команда:
pip3 install -r requirements.txt
Для версии Python 2 команда:
pip install -r requirements.txt
Обязательно запустите pip3 для python3.7.
pip3 freeze >> yourfile.txt
Это должна быть либо проблема совместимости, либо ошибка, из-за которой просто "pip" не работает. Обязательно зайдите в "замороженный" файл и удалите все ненужные вам модули. Это способ, которым я работал над этим.:)
Подход с автоматическим обновлением requirements.txt
При разработке приложения Python с файлом requirements.txt у нас есть несколько вариантов:
- Сгенерируйте файл requirements.txt после разработки, когда мы хотим его развернуть. Это выполняется
pip freeze > requirements.txt
или жеpipreqs
для менее грязного результата. - Добавляйте каждый модуль в файл requirements.txt вручную после каждой установки.
- Установите менеджер, который будет обрабатывать обновления для файла requirements.txt.
Для 1-го варианта есть много ответов, 2-й вариант говорит сам за себя, поэтому я хотел бы описать 3-й подход. Существует библиотека с именем to-requirements.txt . Чтобы установить его, введите следующее:
pip install to-requirements.txt # Pip install to requirements.txt
Если бы вы прочитали всю команду сразу, вы бы увидели, что она делает. После установки вы должны настроить его. Бежать:
requirements-txt setup
Он переопределяет сценарии пипсов, так что каждый
pip install
или же
pip uninstall
автоматически обновляет файл requirements.txt вашего проекта необходимыми версиями пакетов. Переопределение сделано безопасно, так что после удаления этого пакета пип будет вести себя как обычно.
И вы можете настроить способ его работы. Например, отключить его глобально и активировать только для нужных каталогов, активировать только для git-репозиториев или разрешить/запретить создание файла requirements.txt, если он не существует.
Ссылки:
Простой питонический путь
Чтобы получить список всех ТРЕБОВАНИЙ в стандарте
requirements.txt
файл, вы можете использовать следующую команду.
pip freeze > requirements.txt
Теперь это должно автоматически создать стандартный файл требований со всеми установленными пакетами вместе с их соответствующими версиями.
Довольно печать на терминале
Если вы просто хотите получить красивую печать на терминале, вы можете использовать следующий подход.
pip list
Здесь перечислены все установленные пакеты в удобном формате для печати.
Пользовательская зависимость
Если у вас есть папка проекта, например, репозиторий Github, и вы хотите получить настраиваемый файл requirements.txt для проекта, вы можете использовать следующий пакет. https://pypi.org/project/pipreqs/
pipreqs
Применение
$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
Содержание файла requirements.txt
wheel==0.23.0
Yarg==0.1.9
docopt==0.6.2
Лучший способ для Python 3:
pip3 freeze > requirements.txt
это сработало для меня...
Если вы установили много зависимостей в своей системе и вам нужен файл requirements.txt для конкретного проекта, вы можете установить первые pipreqs:
$ pip install pipreqs
и выполните следующую команду в папке проекта.
$ pipreqs
Эта команда сгенерирует файл requirements.txt для конкретного проекта.
Если вы столкнулись с той же проблемой, что и у меня, то есть не в виртуальной среде, и вам нужен файл requirements.txt для конкретного проекта или из выбранной папки (включая дочерние элементы ), а pipreqs не поддерживает.
Вы можете использовать:
import os
import sys
from fuzzywuzzy import fuzz
import subprocess
path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"
files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.py'):
pyfiles.append(os.path.join(root, file))
stopWords = ['from', 'import',',','.']
importables = []
for file in pyfiles:
with open(file) as f:
content = f.readlines()
for line in content:
if "import" in line:
for sw in stopWords:
line = ' '.join(line.split(sw))
importables.append(line.strip().split(' ')[0])
importables = set(importables)
subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)
with open(path+'/requirements.txt') as req:
modules = req.readlines()
modules = {m.split('=')[0].lower() : m for m in modules}
notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']
new_requirements = []
for req_module in importables:
try :
new_requirements.append(modules[req_module])
except KeyError:
for k,v in modules.items():
if len(req_module)>1 and req_module not in notList:
if fuzz.partial_ratio(req_module,k) > 90:
new_requirements.append(modules[k])
new_requirements = [i for i in set(new_requirements)]
new_requirements
with open(path+'/requirements.txt','w') as req:
req.write(''.join(new_requirements))
PS: У него может быть несколько дополнительных библиотек, поскольку он проверяет fuzzylogic.
@Francis прав - /questions/32037315/avtomaticheski-sozdavat-trebovaniya-tekst/57961071#57961071
Но просто добавлю:
С дополнительной поддержкой ноутбуков Jupyter - т.е.
.ipynb
файлы - теперь вы можете использовать https://pypi.org/project/pipreqsnb (тот же синтаксис, что и pipreqs):
pip install pipreqsnb
pipreqs .
[Я не автор]
Если вы хотите перечислить только пакеты, используемые внутри virtualenv, используйте:
pip freeze -l > requirements.txt
Не полное решение, но может помочь составить короткий список для Linux.
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > requirements.txt
Или, если вы используете что-то вроде
virtualenv
вы можете просто запустить эту команду, чтобы создать файл requirements.txt
$ ./.venv/bin/pip freeze > requirements.txt
Я создал эту команду bash.
for l in $(pip freeze); do p=$(echo "$l" | cut -d'=' -f1); f=$(find . -type f -exec grep "$p" {} \; | grep 'import'); [[ ! -z "$f" ]] && echo "$l" ; done;
Чтобы решить эту проблему, всегда запускайте файл requirements.txt только для локальных пакетов. Под локальными пакетами я подразумеваю пакеты, которые находятся только в папке вашего проекта. Для этого выполните: Заморозка пипса —local > requirements.txt
Не замораживание пипсов > requirements.txt. Обратите внимание, что это двойное подчеркивание перед локальным.
Однако установка pipereqs тоже помогает. Пип устанавливает pipreqs.
Однако идеальным решением является наличие pipfile. Пип-файл обновляется сам по себе всякий раз, когда вы устанавливаете новый локальный пакет. Он также имеет pipfile.lock, аналогичный package.json в JavaScript. Для этого всегда устанавливайте свои пакеты с помощью pipenv, а не pip. Так что мы делаем pipenv
С использованием
pip freeze > requirements.txt
это плохой способ создать файл требований! Это может служить временным решением вашей проблемы, но при управлении требованиями к проекту Python лучше всего делать это вручную.
Простой поиск «импорт» или «импорт из x» даст вам список всех зависимостей, которые необходимо установить (ничего лишнего).
Проблема с ним в том, что он просто сбрасывает все установленные пакеты со строгими версиями, у каждой зависимости свои зависимости и они включаются в дамп. Например, у вас установлена lib==1.0, для которой требуется sub-lib==0.5, если вы используете, вы получите обе, но позже, когда вы захотите обновить версию lib до 2.0, скорее всего, вы получите конфликты поскольку lib v2.0 теперь использует sub-lib v1.0, а не v0.5, который вам требуется... Это быстро усложняется для нескольких зависимостей.
Мы столкнулись с этими проблемами в паре проектов, с тех пор я создал автоматизированный скрипт для очистки
pip freeze
, это безопасно (комментирует ненужные зависимости) и отлично работает.
Для другого варианта использования, отличного от исходного вопроса, когда у вас есть среда, но вы не закрепили свои зависимости, я обнаружил, что это противоречиво, поскольку иногда дублируются зависимости с разными версиями, например две записи подушки с версией9.0.0
и9.5.0
а также не уловить некоторые необходимые зависимости.
Я реализовалpipreqs
лично для меня это перебор.
Я видел, как несколько человек упомянули об этомpip freeze
поставляется с оговоркой о хранении ВСЕХ пакетов вашей среды.
Однако есть простое решение, которое мне подходит:
Отсортируйте незакрепленные требования верхнего уровня по файлам dev и core следующим образом:
requirements
├── core.txt
└── dev.txt
Поскольку вам, вероятно, нужны только основные требования для производства,
pip freeze | grep -F -f requirements/core.txt > requirements.txt
Допустим, вы хотели опустить лишнее, например, завершающий+cpu
в конце имен требований (что мне нужно было сделать для развертывания Hugging Face) вы можете заранее подключить конвейерный фильтр.
pip freeze | grep -F -f requirements/core.txt | sed 's/+cpu//g' > requirements.txt
Я считаю, что это намного проще в обслуживании.
Для более новой версии pip (чтобы убедиться, что письменная ссылка является версией пакета, а не локальным каталогом пакета)
pip list --format=freeze > requirements.txt
(источник: /questions/54835094/pip-freeze-sozdaet-strannyij-put-vmesto-versii-paketa/54835102#54835102)
Пользователи Pipenv могут генерироватьrequirement.txt
файл из Pipfile проекта с:
pipenv lock --requirements
pipreqs --savepath=requirements.in && pip-compile
не будет работать, если вы используете оболочку Windows Power
попробуй это;
( pipreqs --savepath=requirements.in ) -and (pip-compile)
Вы можете использовать эту команду в Linux (не уверен в Windows)
pip3 freeze > requirements.txt
Если вы используете PyCharm, когда вы открываете или клонируете проект в PyCharm, он показывает предупреждение и просит вас установить все необходимые пакеты.