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


278

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


2
Вы можете сделать это, запустив pip freeze > requirements.txtвсе ваши библиотеки Python с текущей версией в requirements.txtфайл
Shaikhul

7
@Shaikhul, но это не помогает в том случае, если у вас не установлены зависимости, потому что вы только что загрузили пакет с GitHub ...
jonrsharpe

8
Обратите внимание: a) pip freezeбудет выгружать текущие версии allустановленных модулей в этой системе независимо от их использования в текущем проекте. б) pip будет перечислять только те модули, которые были установлены через pip
akskap

Ответы:


291

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

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

ОБНОВЛЕНИЕ :

Pipenv или другие инструменты рекомендуются для улучшения процесса разработки.

Для Python 3 используйте ниже

pip3 freeze > requirements.txt

3
Для тех, кто ошибается, я рекомендую попробовать, pip3 freeze > requirements.txtпрежде чем задать вопрос.
Баранскистад

3
Я выполняю, pip3 freeze > requirements.txtи я удивлен, что не могу найти некоторые пакеты, которые я на самом деле использую, такие как argparseи configparser. Это потому, что они являются частью ядра Python? Я считаю, что лучшим ответом будет использование pipreqsниже, поскольку в нем будут перечислены только те требования, которые использует ваш проект.
Alexis.Rolland

@ Alexis.Rolland Да, argparseи configparserотносятся ли они к стандартной библиотеке Python3, так что же не так с этим pip3 freeze? Я не понимаю вашу точку зрения.
17

11
@damnever Хорошо, спасибо! pip3 freezeдает мне список всех пакетов Python, установленных в моей среде, а pipreqsдает мне все те, которые фактически использовались в моем исходном коде, что я и искал. Кроме того, в этом нет ничего плохого.
Alexis.Rolland

1
У pipenv есть серьезные проблемы, смотрите это обсуждение: news.ycombinator.com/item?id=18612590
Джастин М. Кейс,

364

Вы можете использовать следующий код для создания файла require.txt:

pip install pipreqs

pipreqs /path/to/project

больше информации, связанной с pipreqs можно найти здесь .

Иногда вы сталкиваетесь pip freeze, но это сохраняет все пакеты в среде, включая те, которые вы не используете в своем текущем проекте.


1
@IgorBarinov Это предупреждение и не создаст проблему для запуска pipreqs, я установил его на python 2.6 и получил то же самое предупреждение, но он создает requirements.txtфайл, спасибо @DJanssens
Shaikhul

1
@Shaikhul Если вы получили эти предупреждения, у вас не будет полного файла, вы просто получите часть требований. Вы можете проверить это на github.com/npow/MemNN/tree/hyperopt repo. У меня есть только «hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0»
Игорь Баринов

1
что сказал it is strongly recommended to upgrade to a newer Python version
Шайхул

2
Отличный инструмент. Спасибо! Его мощная особенность заключается в том, что он генерирует именно используемые пакеты, а не как замораживание pip!
Весам На

1
Это не работает для Python 3.6, если новое форматирование вывода оператора печати - uesd.
Anand CU

12

В моем случае я использую Anaconda, поэтому выполнение следующей команды из терминала conda в моей среде решило ее и автоматически создало для меня этот текстовый файл требований:

conda list -e > requirements.txt

Это было взято из этой ссылки Github pratos / condaenv.txt

Если была замечена ошибка, и вы используете anaconda, попробуйте использовать опцию .yml:

conda env export > <environment-name>.yml

Чтобы окружение могло использовать другой человек ... Или, если вы создаете новую среду на другом компьютере: conda env create -f .yml

Опция .yml была найдена здесь


если вы не используете виртуальную среду, это создаст слишком длинный файл
require.txt

1
Это на самом деле работает? Всякий раз, когда я пробовал это, есть зависимости и особенности синтаксиса, которые pip install requirements.txtотклоняются.
conner.xyz

Я обнаружил некоторые ошибки при использовании .txt, поэтому просто добавил другую опцию, которая тоже работала со мной ... "Использование .yml", упомянутое выше.
HassanSh__3571619

5

Обязательно запустите pip3 для python3.7.

pip3 freeze >> yourfile.txt

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

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

После этого поместите ваш исходный код в каталог. Если вы сейчас запустите файл python, вероятно, он не запустится, если вы используете не родные модули. Вы можете установить эти модули под управлением

pip3 install <module> or pip install <module> 

Это не повлияет на весь список модулей, кроме среды, в которой вы находитесь.

Теперь вы можете выполнить команду сверху, и теперь у вас есть файл требований, который содержит только модули, установленные в виртуальной среде. Теперь вы можете запустить команду сверху.

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

Надеюсь, это помогло.


1

Если столкнулся с той же проблемой, что и моя, то есть не в виртуальной среде, и хочет, чтобы файл require.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.


1

Лучший способ для Python 3 это:

pip3 freeze > requirements.txt

у меня это сработало ...


0

если вы используете PyCharm, когда вы открываете или клонируете проект в PyCharm, он показывает предупреждение и просит вас установить все необходимые пакеты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.