Автоматически создавать требования. Текст

Иногда я загружаю исходный код Python из github и не знаю, как установить все зависимости. Если нет файла require.txt, я должен создать его вручную. Вопрос в том, что при наличии директории с исходным кодом на python можно ли автоматически создавать файл require.txt из раздела импорта?

30 ответов

Решение

Если вы используете виртуальную среду, pip freeze > requirements.txt просто хорошо. Если нет, то сигары будут хорошим выбором для вас.

Кстати, я не гарантирую, что он будет работать с 2.6.

ОБНОВЛЕНИЕ:

Pipenv рекомендуется для современных приложений Python.

Вы можете использовать следующий код для создания файла 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

Здесь вам нужно совместить со вторым инструментом.

  1. пип-инструменты

примет пакеты и сгенерирует их со всеми подпакетами. Например, если у вас есть pandas==1.3.2 в , pip-tools будет генерировать

numpy==1.21.2 # via pandas в .

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

Здесь вы можете использовать первый инструмент.

Но оба инструмента пишут в. Так как же это исправить?

Использовать --savepath для pipreqs писать в requirements.in вместо значения по умолчанию.

Сделать это одной командой; просто делать

Вот и все. Теперь вам не нужно беспокоиться о ручном обслуживании пакетов, и у вас будут все подпакеты, так что ваша сборка будет детерминированной.

TL;DR

  1. pip3 install pipreqs
  2. 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 у нас есть несколько вариантов:

  1. Сгенерируйте файл requirements.txt после разработки, когда мы хотим его развернуть. Это выполняется pip freeze > requirements.txtили же pipreqsдля менее грязного результата.
  2. Добавляйте каждый модуль в файл requirements.txt вручную после каждой установки.
  3. Установите менеджер, который будет обрабатывать обновления для файла 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, если он не существует.

Ссылки:

  1. Документация - https://requirements-txt.readthedocs.io/en/latest/
  2. GitHub — https://github.com/VoIlAlex/requirements-txt
  3. PyPI — https://pypi.org/project/to-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, он показывает предупреждение и просит вас установить все необходимые пакеты.

Другие вопросы по тегам